說明:這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言、ios開發不感興趣,請忽略
這講介紹最後乙個預處理指令---檔案包含
其實我們早就有接觸檔案包含這個指令了, 就是#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第1行是由#include "one.h"導致的,第2、3行是由#include "two.h"導致的(因為two.h裡面包含了one.h)。可以看出來,one函式被宣告了2遍,根本就沒有必要,這樣會降低編譯效率。void
one();
2void
one();
3void
two();
4int
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第2~第7行是#include "one.h"導致的,第10~第23行是#include "two.h"導致的。編譯預處理之後就變為了://#include "one.h"2#
ifndef _one_h_
3#define _one_h_45
void
one();67
#endif89
//#include "two.h"10#
ifndef
_two_h_
11#define _two_h_
1213
//#include "one.h"14#
ifndef
_one_h_
15#define _one_h_
1617
void
one();
1819
#endif
2021
void
two();
2223
#endif
1這才是我們想要的結果void
one();
2void two();
C語言 17 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...
C語言 17 預處理指令3 檔案包含
這講介紹最後乙個預處理指令 檔案包含 其實我們早就有接觸檔案包含這個指令了,就是 include,它可以將乙個檔案的全部內容拷貝另乙個檔案中。直接到c語言庫函式標頭檔案所在的目錄中尋找檔案 系統會先在源程式當前目錄下尋找,若找不到,再到作業系統的path路徑中查詢,最後才到c語言庫函式標頭檔案所在目...
C語言 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...