這講介紹最後乙個預處理指令---檔案包含
其實我們早就有接觸檔案包含這個指令了, 就是#include,它可以將乙個檔案的全部內容拷貝另乙個檔案中。
直接到c語言庫函式標頭檔案所在的目錄中尋找檔案
系統會先在源程式當前目錄下尋找,若找不到,再到作業系統的path路徑中查詢,最後才到c語言庫函式標頭檔案所在目錄中查詢
1.#include指令允許巢狀包含,比如a.h包含b.h,b.h包含c.h,但是不允許遞迴包含,比如 a.h 包含 b.h,b.h 包含 a.h。
下面的做法是錯誤的
2.使用#include指令可能導致多次包含同乙個標頭檔案,降低編譯效率
比如下面的情況:
在one.h中宣告了乙個one函式;在two.h中包含了one.h,順便宣告了乙個two函式。(這裡就不寫函式的實現了,也就是函式的定義)
假如我想在main.c中使用one和two兩個函式,而且有時候我們並不一定知道two.h中包含了one.h,所以可能會這樣做:
編譯預處理之後main.c的**是這樣的:
1 void one();第1行是由#include "one.h"導致的,第2、3行是由#include "two.h"導致的(因為two.h裡面包含了one.h)。可以看出來,one函式被宣告了2遍,根本就沒有必要,這樣會降低編譯效率。2 void one();
3 void two();
4 int main ()
5
為了解決這種重複包含同乙個標頭檔案的問題,一般我們會這樣寫標頭檔案內容:
大致解釋一下意思,就拿one.h為例:當我們第一次#include "one.h"時,因為沒有定義_one_h_,所以第9行的條件成立,接著在第10行定義了_one_h_這個巨集,然後在13行宣告one函式,最後在15行結束條件編譯。當第二次#include "one.h",因為之前已經定義過_one_h_這個巨集,所以第9行的條件不成立,直接跳到第15行的#endif,結束條件編譯。就是這麼簡單的3句**,防止了one.h的內容被重複包含。
這樣子的話,main.c中的:
#include "one.h"就變成了:#include "two.h"
1 // #include "one.h"第2~第7行是#include "one.h"導致的,第10~第23行是#include "two.h"導致的。編譯預處理之後就變為了:2 #ifndef _one_h_
3 #define _one_h_
4 5 void one();
6 7 #endif
8 9 // #include "two.h"
10 #ifndef _two_h_
11 #define _two_h_
12 13 // #include "one.h"
14 #ifndef _one_h_
15 #define _one_h_
16 17 void one();
18 19 #endif
20 21 void two();
22 23 #endif
1 void one();這才是我們想要的結果2 void two();
C語言 17 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...
C語言 17 預處理指令3 檔案包含
說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 其實我們早就有接觸檔案包含這個指令了,就是 include,它可以將乙個檔案的全部內...
C語言 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...