感謝:
一、基本概念
其實我們早就有接觸檔案包含這個指令了, 就是#include,它可以將乙個檔案的全部內容拷貝另乙個檔案中。
二、一般形式
1. 第1種形式#include 《檔名》 ---- 是系統自帶的
直接到c語言庫函式標頭檔案所在的目錄中尋找檔案
2. 第2種形式 #include "檔名" ---- 一般是使用者自己定義的
系統會先在源程式當前目錄下尋找,若找不到,再到作業系統的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中的**是這樣:
void one();
void one();
void two();
int main ()
第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"
就變成了:// #include "one.h"
#ifndef _one_h_
#define _one_h_
void one();
#endif
// #include "two.h"
#ifndef _two_h_
#define _two_h_
// #include "one.h"
#ifndef _one_h_
#define _one_h_
void one();
#endif
void two();
#endif
第2~第7行是#include "one.h"導致的,第10~第23行是#include "two.h"導致的。編譯預處理之後就變為了:void one();
void two();
感謝: C語言 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...
C語言 17 預處理指令3 檔案包含
本文目錄 說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 回到頂部 其實我們早就有接觸檔案包含這個指令了,就是 include,它可...
C語言 17 預處理指令3 檔案包含
說明 這個c語言專題,是學習ios開發的前奏。也為了讓有物件導向語言開發經驗的程式設計師,能夠快速上手c語言。如果你還沒有程式設計經驗,或者對c語言 ios開發不感興趣,請忽略 這講介紹最後乙個預處理指令 檔案包含 其實我們早就有接觸檔案包含這個指令了,就是 include,它可以將乙個檔案的全部內...