C陷阱與缺陷(六)預處理器

2021-06-13 06:10:29 字數 776 閱讀 5477

第六章 預處理器

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 還支援很多預處理...