1.#define
#define name stuff
當有name出現時,預處理器就會把它替換成stuff
當stuff非常長的時候,可以分成好幾行,除了最後一行外,每行都要加上乙個反斜槓
#define debug_print printf( "file %s line %d :\
"x=%d, y = %d, z = %d",\
__file__, __line__,\
x,y,z)
當我們在程式裡邊使用debug時,後邊就要新增分號,而定義define那裡就不需要分號
2.巨集就是說可以將引數替換到文字中,,這種實現通常稱為巨集或者巨集定義
巨集的宣告方式
#define name(parameter-list) stuff// 這裡左括號必須和name緊鄰,不然會被認為是stuff一部分,當巨集被呼叫時,名字後面是由逗號分隔的值的列表,每個與定義時的相對應,使用括號包圍,即每個引數對應的實際值都將被替換到stuff中
舉個例子
#define square(x) x*x
square(5)
然後預處理器就用5*5代替】
2.2巨集是不可以出現遞迴
2.3巨集與函式
巨集非常頻繁地用於簡單計算,比如在兩個表示式中尋找其中較大或者較小的乙個
#define max(a, b) ((a) > (b)?(a):(b) )
2.4帶***的巨集引數
當巨集引數在巨集定義中出現超過一次時,函式可能會有***,比如上邊那個換成a++,b++
2.6#undef
用於移除乙個巨集定義
#undef name
想要在現存的名字重新定義,舊定義必須使用#undef移除
14.3條件編譯
使得某條語句或者某組語句進行翻譯或者被忽略
語法形式:
#if constant-expression//這個常量表示式由預處理器進行求值;如果值是非0,statements正常編譯,否則,預處理就刪除他們
statements
#endif
#define debug 1
if debug
printf( "x=%d, y=%d\n", x,y);
#endif
如果要忽略他就直接把符號定義為0;
#if還可以具有可以選的#elif 和#else子句
#if constant-expression
statements
#elif constant-expression//出現次數不限
other statements
#else
other statements
#endif
14.4檔案包含
14.4.1 函式庫檔案包含
#include //以.h結尾
14.4.2本地檔案包含
#include "filename"
《C和指標》第14章 預處理器
14.2.1 巨集 define包括乙個規定,允許把引數替換到文字中,這種實現通常稱為巨集 macro define square x x x 則程式中的square 5 會被替換成 5 5 警告 例1 a 5 printf d n square a 1 會被替換成5 1 5 1,列印結果是11,不...
C和指標(第14章 預處理器)
程式編寫,編譯第一步就是巨集的宣告,也稱預處理器階段,在編譯之前,有刪除注釋,插入被 include指令包含的檔案的內容 和 define所替換的符號等。14.1 五種預處理符號 file name.c 進行編譯的源檔名 line 25 檔案當前的行號 date jan 14 2019 檔案被編譯的...
C和指標 學習筆記 第14章 預處理器
c預處理器在源 編譯之前對其進行一些文字性質的操作。它的主要任務包括刪除注釋 插入被 include指令包含的檔案的內容 定義和替換由 define指令定義的符號以及確定 的部分內容是否應該根據一些條件編譯指令進行編譯。1.預定義符號 預處理器定義的符號,它們的值或者是字串常量,或者是十進位制數字常...