1、過程:1>標頭檔案展開 2>巨集替換 3>條件編譯
注:在程式中凡是有#開頭的都屬於預處理階段
2、<>與「 」的區別
系統的頭檔案目錄為:/usr/include,<>的含義為指定標頭檔案的搜尋路徑為系統的頭檔案目錄:/usr/include,而「 」是在當前的目錄找,找不到再去系統的標頭檔案中找。
一般來說,自己寫的標頭檔案用「 」,系統的標頭檔案用<>
3、巨集定義:
1、如int a[3],當中的3為幻數,因為可讀性差,要杜絕幻術可以使用巨集定義:#define max_size 3。
2、使用巨集定義的注意事項:
1>巨集定義無分號 2>巨集定義要體現它的意義 3>巨集定義要大寫 4>巨集定義不要以雙下劃線開頭(不與系統的巨集衝突)
3、巨集函式:
例:#define max(a,b) a > b ? a : b
int max = max(5 * 3,6 + 7);
這樣替換的結果可能會出錯,可以這樣
#define max(a,b) (a) > (b) ? (a) : (b)
4、定義函式和巨集函式的區別
1>巨集定義在預處理階段就完成,而函式需要經歷四個階段
2>巨集定義不分配記憶體空間,定義函式需要分配記憶體空間
3>巨集定義製作傻瓜式替換,而自定義比較複雜
4>
5、什麼時候用巨集函式什麼時候用自定義函式
簡短而且頻率頻繁呼叫的函式用巨集函式
6、編譯時間、執行時間
巨集函式編譯時間長:以編譯時間換記憶體空間
一記憶體空間換執行時間的例子:內嵌函式
inline int main(int a)
如果max呼叫連續四次,inline會把實踐部分載入到函式呼叫處,占用了記憶體空間,但提高執行時間。(c99標準)
7、巨集的使用技巧:
1>printf("%d\n",__line__); 列印行號
2>printf("%s:%d\n",__func__,__line__);
列印所在行號並且列印其所在函式,此函式可用來除錯段錯誤。
3>其他系統巨集:__time__:顯示時間 __date__:顯示日期
8、條件編譯
1、例子:
int main()
注釋:#if 0
#endif
2、如果a.h中有func1.h且裡面定義了a = 5;func1.h中有a.h且定義的吧= 5;那麼在mian中引用a.h與fun1.c標頭檔案展開時會出現重複定義
如果在fun1.h中加:
#ifdef a_h
#define a_h
int a = 5;
#endif
加了的作用是放置標頭檔案重複包含帶來的重複定義
C語言預處理
c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...
C語言預處理
預處理 系統自動自動呼叫預處理程式對程式中 號開頭的預處理部分進行處理,處理完畢後可以進城源程式的編譯階段。預定義 一些預定義符號 常用於除錯 file 正在預編譯的源檔名 line 當前行號 只有這個是整數常量,其他是字串常量 function 當前所在函式名 date 當前日期 time 當前時...
c語言預處理
預處理可以包含 1 巨集定義指令 2 標頭檔案包括指令 3 條件編譯指令 4 編譯程式可以識別的特殊符號 巨集定義 define undef 檔案包含 include 條件編譯 if ifdef else elif endif等 其他 line error program等 注意事項 1 在c語言中...