預處理器發生在程式被編譯之前,所有的預處理器指令都以#開頭。
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。如 可以使用這些設施來預防多次包含同乙個標頭檔案 ...