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

2021-07-04 19:09:42 字數 2105 閱讀 5173

感謝:

一、基本概念

其實我們早就有接觸檔案包含這個指令了, 就是#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,它可以將乙個檔案的全部內...