預處理器小結

2021-06-04 23:34:50 字數 1528 閱讀 3569

預處理器發生在程式被編譯之前,所有的預處理器指令都以#開頭。

1.  #include預處理器指令:使指定檔案的乙個副本被包含到指令所在的位置。

#include 與#include 「filename」區別(簡單不加以說明)

#include 指令用於包含標準類庫標頭檔案,也可以用於由多個原始檔組成的程式。

2.  #include 預處理器指令:符號常量

#define identifier replacement – text

e.g.  #define pi 3.14159

3.  #include 預處理器指令:巨集

帶乙個實參巨集的定義,用於計算乙個圓的面積。

e.g.  #define circle_area(x) (pi*(x)(x))

4.  條件編譯

條件編譯通常用於除錯目的,程式設計師經常用輸出語句來輸出變數的值,從而可以驗證程式的控制流。

e.g. #ifdef debug

cerr << 「variable x=」 << x<#endif

5.  #error和#pragma預處理指令

#error 指令:

#error tokens會輸出一條依賴於實現的訊息,其中包含了這條指令中指定的標記,標記是由空格分隔的字串行。

例如:#error 1 – out of range error 包含了6個標記

e.g. 在某種流行的c++編譯器中,當處理#error指令時,指令中的標記就會作為錯誤的訊息顯示,預處理過程停止,程式不會被編譯。

#pragma指令:

#pragma tokens 會導致發生由具體實現定義的操作,具體實現無法識別的pragma指令會被忽略。

e.g. 在vc++中加上#pragma pack(n)來處理記憶體以n位元組對齊

6.     #和##運算子

#和##在c和c++中都提供

#運算子會使替換文字標記被轉換成雙引號中的字串

e.g. #define hello(x) cout<<"hello,"#x《當hello(john);出現在程式文字中,他會被擴充套件為cout<<" hello,john"《輸出結果:hello,john

注意:#運算子必須用於帶是參的巨集,因為它的運算元表示巨集的實參。

##運算子將會將兩個標記拼接起來

e.g. #define tokenconcat(x,y) x##y 當tokenconcat出現在程式中時,它的實參會被拼接在一起,用於替換巨集

e.g. tokenconcat(o,k)在程式中會被替換為ok

注:##運算子必須有2個運算元。

一道中科大洋的筆試題:

#define paster( n ) printf( "token" #n" = %d", token##n )

那麼語句paster(9);展開後為printf( "token9 = %d", token9)

預處理器簡介

預處理是c編譯器做的第一件事情,主要是做一些文字方面的工作。包括 刪除注釋 插入被 include包含的檔案 定義和替換由 define指令定義的符號以及 的部份內容,和條件編譯。預定義符號 預定義符號如下表所示 file 進行編譯的檔名 line 檔案的當前行號 date 檔案編譯的日期 time...

C 預處理器

偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...

預處理器變數

1 預處理器變數經常用大寫字母表示。預處理器變數可以避免多重包含 define指令接受乙個名字並定義該名字為預處理器變數 ifndef指示檢測指定的預處理器變數是否未定義,如果預處理器變數未定義,那麼跟在其後的所以指示都被處理,直到出現 endif。如 可以使用這些設施來預防多次包含同乙個標頭檔案 ...