天天看點

C 頭檔案

頭檔案是擴充名為 <b>.h</b> 的檔案,包含了 C 函數聲明和宏定義,被多個源檔案中引用共享。有兩種類型的頭檔案:程式員編寫的頭檔案和編譯器自帶的頭檔案。

在程式中要使用頭檔案,需要使用 C 預處理指令 <b>#include</b> 來引用它。前面我們已經看過 <b>stdio.h</b> 頭檔案,它是編譯器自帶的頭檔案。

引用頭檔案相當于複制頭檔案的内容,但是我們不會直接在源檔案中複制頭檔案的内容,因為這麼做很容易出錯,特别在程式是由多個源檔案組成的時候。

A simple practice in C 或 C++ 程式中,建議把所有的常量、宏、系統全局變量和函數原型寫在頭檔案中,在需要的時候随時引用這些頭檔案。

使用預處理指令 <b>#include</b> 可以引用使用者和系統頭檔案。它的形式有以下兩種:

這種形式用于引用系統頭檔案。它在系統目錄的标準清單中搜尋名為 file 的檔案。在編譯源代碼時,您可以通過 -I 選項把目錄前置在該清單前。

這種形式用于引用使用者頭檔案。它在包含目前檔案的目錄中搜尋名為 file 的檔案。在編譯源代碼時,您可以通過 -I 選項把目錄前置在該清單前。

<b>#include</b> 指令會訓示 C 預處理器浏覽指定的檔案作為輸入。預處理器的輸出包含了已經生成的輸出,被引用檔案生成的輸出以及 <b>#include</b> 指令之後的文本輸出。例如,如果您有一個頭檔案 header.h,如下:

和一個使用了頭檔案的主程式 program.c,如下:

編譯器會看到如下的代碼資訊:

如果一個頭檔案被引用兩次,編譯器會處理兩次頭檔案的内容,這将産生錯誤。為了防止這種情況,标準的做法是把檔案的整個内容放在條件編譯語句中,如下:

這種結構就是通常所說的包裝器 <b>#ifndef</b>。當再次引用頭檔案時,條件為假,因為 HEADER_FILE 已定義。此時,預處理器會跳過檔案的整個内容,編譯器會忽略它。

有時需要從多個不同的頭檔案中選擇一個引用到程式中。例如,需要指定在不同的作業系統上使用的配置參數。您可以通過一系列條件來實作這點,如下:

但是如果頭檔案比較多的時候,這麼做是很不妥當的,預處理器使用宏來定義頭檔案的名稱。這就是所謂的<b>有條件引用</b>。它不是用頭檔案的名稱作為 <b>#include</b> 的直接參數,您隻需要使用宏名稱代替即可:

SYSTEM_H 會擴充,預處理器會查找 system_1.h,就像 <b>#include</b> 最初編寫的那樣。SYSTEM_H 可通過 -D 選項被您的 Makefile 定義。

上一篇: C 指針
下一篇: C++ 循環