C語言 17 預處理指令3 檔案包含

2021-09-08 11:54:44 字數 2124 閱讀 5493

這講介紹最後乙個預處理指令---檔案包含

其實我們早就有接觸檔案包含這個指令了, 就是#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();

2 void one();

3 void two();

4 int main ()

5

第1行是由#include "one.h"導致的,第2、3行是由#include "two.h"導致的(因為two.h裡面包含了one.h)。可以看出來,one函式被宣告了2遍,根本就沒有必要,這樣會降低編譯效率。

為了解決這種重複包含同乙個標頭檔案的問題,一般我們會這樣寫標頭檔案內容:

大致解釋一下意思,就拿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 #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

第2~第7行是#include "one.h"導致的,第10~第23行是#include "two.h"導致的。編譯預處理之後就變為了:

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,它可...