第六章 預處理器
1、不能忽視巨集定義中的空格
巨集提供了一種對組成c程式的字元進行變換的方式,而並不作用於程式中的物件
#define f (x) ((x)-1)
因為f和後面的(x)之間多了乙個空格,所以f代表(x) ((x)-1)
注:這一規則不適用於巨集呼叫,只對巨集定義適用
2、巨集並不是函式
巨集定義中每個引數用括號括起來,最後整個結果表示式也用括號括起來
目的:預防巨集展開後因為優先順序引起的計算錯誤
巨集定義中盡量避免++等運算,容易引起***
3、巨集並不是語句
assert巨集,引數是乙個表示式,如果表示式為0,就使程式終止執行
帶多重if語句時,容易匹配錯誤
巨集assert的正確定義
#define assert ((void) ((e) || _assert_error(_file_,_line_)))
利用了||運算子對兩側的運算元一次順序求值的性質
4、巨集並不是型別定義
最好使用typedef定義型別
#define t1 struct foo *
typedef struct foo *t2;
從定義來看,兩者概念完全一致
但是當宣告多個變數時,就出錯了!
t1 a,b;
t2 a,b;
第乙個宣告被擴充套件為struct foo * a,b;
這個語句中a被定義為乙個指向結構的指標,而b卻被定義為乙個結構
第二個宣告中a和b都是指向結構的指標
C 預處理器
偶爾翻c 的教材,看到了一些以前自己不太關注的角落。參考教材 c 大學教程 harvey m.deitel 和paul james deitel著。預處理發生在編譯之前,包括把其他檔案包含到要編譯的檔案中 定義符號常量和巨集 程式 的條件編譯以及預處理指令的條件執行。對應的,預處理指令有 檔案包含命...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...
C 預處理器
預處理器是一些指令,指示編譯器在實際編譯之前所需完成的預處理。所有的預處理器指令都是以井號 開頭,只有空格字元可以出現在預處理指令之前。預處理指令不是 c 語句,所以它們不會以分號 結尾。我們已經看到,之前所有的例項中都有 include指令。這個巨集用於把頭檔案包含到原始檔中。c 還支援很多預處理...