C語言#include的用法

2020-07-16 10:04:28
#include 命令是預處理命令的一種,預處理命令可以將別的原始碼內容插入到所指定的位置;可以標識出只有在特定條件下才會被編譯的某一段程式程式碼;可以定義類似識別符號功能的宏,在編譯時,前處理器會用別的文字取代該宏。

插入標頭檔案的內容

#include 命令告訴前處理器將指定標頭檔案的內容插入到前處理器命令的相應位置。有兩種方式可以指定插入標頭檔案:
#include <檔名>
#include "檔名"

如果需要包含標準庫標頭檔案或者實現版本所提供的標頭檔案,應該使用第一種格式。如下例所示:
#include <math.h>               // 一些數學函數的原型,以及相關的型別和宏

如果需要包含針對程式所開發的原始檔,則應該使用第二種格式。採用 #include 命令所插入的檔案,通常副檔名是 .h,檔案包括函數原型、宏定義和型別定義。只要使用 #include 命令,這些定義就可被任何原始檔使用。如下例所示:
#include "myproject.h"         // 用在當前專案中的函數原型、型別定義和宏

可以在 #include 命令中使用宏。如果使用宏,該宏的取代結果必須確保生成正確的 #include 命令。例 1 展示了這樣的 #include 命令。

【例1】在 #include 命令中的宏
#ifdef        _DEBUG_
  #define       MY_HEADER       "myProject_dbg.h"
#else
  #define       MY_HEADER       "myProject.h"
#endif
#include        MY_HEADER

當上述程式程式碼進入預處理時,如果 _DEBUG_ 宏已被定義,那麼前處理器會插入 myProject_dbg.h 的內容;如果還沒定義,則插入 myProject.h 的內容。

前處理器如何找到標頭檔案

由給定的 C 語言實現版本決定 #include 命令所指定檔案的搜尋路徑。同時,也由實現版本決定檔名是否區分大小寫。對於命令中使用尖括號指定的檔案(<檔名>),前處理器通常會在特定的系統路徑下搜尋,例如,在 Unix 系統中,會搜尋路徑 /usr/local/include 與 /usr/include。

對於命令中用雙引號指定的檔案("檔名"),前處理器通常首先在當前目錄下尋找,也就是包含該程式其他原始檔的目錄。如果在當前目錄下沒有找到,那麼前處理器也會搜尋系統的 include 路徑。檔名中可以包含路徑。但如果檔名中包含了路徑,則前處理器只會到該目錄下尋找。

你也可以通過使用編譯器命令列選項,或在環境變數(該變數通常稱為 INCLUDE)中加入搜尋路徑,為 #include 命令指定自己的搜尋路徑。具體的做法請參考採用的編譯器的說明文件。

巢狀的 #include 命令

#include 命令可以巢狀使用;也就是說,通過 #include 命令插入的原始檔本身也可以包含另一個 #include 命令。前處理器最多允許 15 層的巢狀包含。

因為標頭檔案有時候會包含另一個標頭檔案,很容易發生相同的一個檔案被多次包含的情況。例如,假設檔案 myProject.h 中包含如下程式碼:
#include <stdio.h>

如果原始檔包含下面的 #include 命令,就會兩次包含 stdio.h,一次是直接包含,另一次是間接包含
#include <stdio.h>
#include "myProject.h"

然而,可以採用條件式編譯的命令,方便地避免多次包含相同的檔案。例 2 使用了這個技巧。

【例2】避免多次包含
#ifndef INCFILE_H_
#define INCFILE_H_
/* ...實際的標頭檔案incfile.h的內容寫在這裡... */
#endif  /* INCFILE_H_ */

第一次出現包含 incfile.h 的命令時,INCFILE_H_ 宏是沒有定義的。前處理器因此插入 #ifndef 和 #endif 之間的內容,這段內容包含了對 INCFILE_H_ 宏的定義。嵌入 incfile.h 檔案之後,#ifndef 條件就會為 false,前處理器會忽略 #ifndef 和 #endif 之間的內容。