C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:10,300

C語言#include的用法

#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 之間的內容。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo