1. 程式人生 > >C語言之#include用法詳解

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__,這樣的巨集名

出現的重複的機率就很低了!