C語言之#include用法詳解
學習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__,這樣的巨集名
出現的重複的機率就很低了!