C語言的預處理

編譯預處理

(一)、程序形成過程:預處理---->編譯---->彙編---->鏈接

(二)、預處理階段

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)
{
    return a > b ? a : b;
}
如果max調用連續四次,inline會把實踐部分加載到函數調用處,佔用了內存空間,但提高執行時間。(C99標準)
7、宏的使用技巧:
1>printf("%d\n",__LINE__);    打印行號
2>printf("%s:%d\n",__func__,__LINE__);
打印所在行號並且打印其所在函數,此函數可用來調試段錯誤。
3>其他系統宏:__TIME__:顯示時間 __DATE__:顯示日期
8、條件編譯
1、例子:
int main()
{
    #ifdef MAX    //如果定義了MAX這個宏,則
    printf("a");
    #else              //否則
    printf("b");
    #endif            //結束
}
註釋:
#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
加了的作用是放置頭文件重複包含帶來的重複定義
發佈了47 篇原創文章 · 獲贊 31 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章