C語言 頭文件

c語言 頭文件

頭文件是擴(kuò)展名為 .h 的文件,包含了 c 函數(shù)聲明和宏定義,被多個(gè)源文件中引用共享。有兩種類型的頭文件:程序員編寫的頭文件和編譯器自帶的頭文件。

在程序中要使用頭文件,需要使用 c 預(yù)處理指令 #include 來引用它。前面我們已經(jīng)看過 stdio.h 頭文件,它是編譯器自帶的頭文件。

引用頭文件相當(dāng)于復(fù)制頭文件的內(nèi)容,但是我們不會(huì)直接在源文件中復(fù)制頭文件的內(nèi)容,因?yàn)檫@么做很容易出錯(cuò),特別在程序是由多個(gè)源文件組成的時(shí)候。

a simple practice in c 或 c++ 程序中,建議把所有的常量、宏、系統(tǒng)全局變量和函數(shù)原型寫在頭文件中,在需要的時(shí)候隨時(shí)引用這些頭文件。

 

1. 引用頭文件的語法

使用預(yù)處理指令 #include 可以引用用戶和系統(tǒng)頭文件。它的形式有以下兩種:

#include <file>

這種形式用于引用系統(tǒng)頭文件。它在系統(tǒng)目錄的標(biāo)準(zhǔn)列表中搜索名為 file 的文件。在編譯源代碼時(shí),您可以通過 -i 選項(xiàng)把目錄前置在該列表前。

#include "file"

這種形式用于引用用戶頭文件。它在包含當(dāng)前文件的目錄中搜索名為 file 的文件。在編譯源代碼時(shí),您可以通過 -i 選項(xiàng)把目錄前置在該列表前。

 

2. 引用頭文件的操作

#include 指令會(huì)指示 c 預(yù)處理器瀏覽指定的文件作為輸入。預(yù)處理器的輸出包含了已經(jīng)生成的輸出,被引用文件生成的輸出以及 #include 指令之后的文本輸出。例如,如果您有一個(gè)頭文件 header.h,如下:

char *test (void);

和一個(gè)使用了頭文件的主程序 program.c,如下:

int x;
#include "header.h"

int main (void)
{
   puts (test ());
}

編譯器會(huì)看到如下的令牌流:

int x;
char *test (void);

int main (void)
{
   puts (test ());
}

 

2. 只引用一次頭文件

如果一個(gè)頭文件被引用兩次,編譯器會(huì)處理兩次頭文件的內(nèi)容,這將產(chǎn)生錯(cuò)誤。為了防止這種情況,標(biāo)準(zhǔn)的做法是把文件的整個(gè)內(nèi)容放在條件編譯語句中,如下:

#ifndef header_file
#define header_file

the entire header file file

#endif

這種結(jié)構(gòu)就是通常所說的包裝器 #ifndef。當(dāng)再次引用頭文件時(shí),條件為假,因?yàn)?header_file 已定義。此時(shí),預(yù)處理器會(huì)跳過文件的整個(gè)內(nèi)容,編譯器會(huì)忽略它。

 

3. 有條件引用

有時(shí)需要從多個(gè)不同的頭文件中選擇一個(gè)引用到程序中。例如,需要指定在不同的操作系統(tǒng)上使用的配置參數(shù)。您可以通過一系列條件來實(shí)現(xiàn)這點(diǎn),如下:

#if system_1
   # include "system_1.h"
#elif system_2
   # include "system_2.h"
#elif system_3
   ...
#endif

但是如果頭文件比較多的時(shí)候,這么做是很不妥當(dāng)?shù)?,預(yù)處理器使用宏來定義頭文件的名稱。這就是所謂的有條件引用。它不是用頭文件的名稱作為 #include 的直接參數(shù),您只需要使用宏名稱代替即可:

 #define system_h "system_1.h"
 ...
 #include system_h

system_h 會(huì)擴(kuò)展,預(yù)處理器會(huì)查找 system_1.h,就像 #include 最初編寫的那樣。system_h 可通過 -d 選項(xiàng)被您的 makefile 定義。

下一節(jié):c 強(qiáng)制類型轉(zhuǎn)換

c 簡(jiǎn)介

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频