學習Linux C,必須要理解include,只要弄清以下幾個問題,就能完全理解include了!
1.#include 實質是什么?
預編譯的時候copy include頭文件的內容到當前行
(疑問:預編譯命令 $gcc -E test.c -o test.i)
2.#include “” 與<> 有何區別?如何驗證你的結論?
“”先在當前目錄查找有無該頭文件,有則包含該目錄下的頭文件,沒有則到系統指定的目錄下找該頭文件
<>直接到系統指定的目錄下查找該文件
(疑問:系統制定的默認目錄為/user/include/,我們常使用的printf函數是在/user/include/stdio.h的文件中聲明的)
驗證結論:分別在當前目錄和系統指定的目錄下定義同名的頭文件,但內容不一致,預編譯后,看包含了哪個目錄下的頭文件
在gcc編譯的時候,也可以通過-I 指定頭文件所在的目錄,若在指定的目錄找不到,則回到默認的目錄下查找
3.被#include的header file中最常見的內容分為哪幾類?
宏定義
typedef
包含別的頭文件
inline函數定義
函數聲明
struct,union,enum類型定義
(其實可以打開一個.h文件來看看,如 /user/include/stdio.h)
4.如何防止重復#include?(更確切的表述為“重復#include時如何防止重復定義/聲明?”)需要說出2種方案,并說明各自的優缺點?
方案一:#pragma once 優點:不會出現宏名重復 缺點:某些老的編譯器不支持
方案二:#ifndef XXX
#define XXX
#endif 優點:所以的編譯器都支持 缺點:出現宏名重復
一般我們看到大多都是選擇方案二,我們只要避免宏名重復就行了
宏名規則(大寫,文件名作為宏名主體,以兩個下劃線開頭以下劃線結束),例如ov8830.h,宏名為__OV8830_H__,這樣的宏名
出現的重復的幾率就很低了!