頭文件是擴(kuò)展名為.h的文件,包含了 C 函數(shù)聲明和宏定義,被多個(gè)源文件中引用共享。有兩種類(lèi)型的頭文件:程序員編寫(xiě)的頭文件和編譯器自帶的頭文件。
在程序中要使用頭文件,需要使用 C 預(yù)處理指令#include來(lái)引用它。前面我們已經(jīng)看過(guò)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ù)原型寫(xiě)在頭文件中,在需要的時(shí)候隨時(shí)引用這些頭文件。
引用頭文件的語(yǔ)法
使用預(yù)處理指令#include可以引用用戶和系統(tǒng)頭文件。它的形式有以下兩種:
#include
這種形式用于引用系統(tǒng)頭文件。它在系統(tǒng)目錄的標(biāo)準(zhǔn)列表中搜索名為 file 的文件。在編譯源代碼時(shí),您可以通過(guò) -I 選項(xiàng)把目錄前置在該列表前。
#include"file"
這種形式用于引用用戶頭文件。它在包含當(dāng)前文件的目錄中搜索名為 file 的文件。在編譯源代碼時(shí),您可以通過(guò) -I 選項(xiàng)把目錄前置在該列表前。
引用頭文件的操作
#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 ());}
只引用一次頭文件
如果一個(gè)頭文件被引用兩次,編譯器會(huì)處理兩次頭文件的內(nèi)容,這將產(chǎn)生錯(cuò)誤。為了防止這種情況,標(biāo)準(zhǔn)的做法是把文件的整個(gè)內(nèi)容放在條件編譯語(yǔ)句中,如下:
#ifndef HEADER_FILE#define HEADER_FILE the entire header file file#endif
這種結(jié)構(gòu)就是通常所說(shuō)的包裝器#ifndef。當(dāng)再次引用頭文件時(shí),條件為假,因?yàn)?HEADER_FILE 已定義。此時(shí),預(yù)處理器會(huì)跳過(guò)文件的整個(gè)內(nèi)容,編譯器會(huì)忽略它。
有條件引用
有時(shí)需要從多個(gè)不同的頭文件中選擇一個(gè)引用到程序中。例如,需要指定在不同的操作系統(tǒng)上使用的配置參數(shù)。您可以通過(guò)一系列條件來(lái)實(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ù)模A(yù)處理器使用宏來(lái)定義頭文件的名稱。這就是所謂的有條件引用。它不是用頭文件的名稱作為#include的直接參數(shù),您只需要使用宏名稱代替即可:
#define SYSTEM_H "system_1.h"...#include SYSTEM_H
SYSTEM_H 會(huì)擴(kuò)展,預(yù)處理器會(huì)查找 system_1.h,就像#include最初編寫(xiě)的那樣。SYSTEM_H 可通過(guò) -D 選項(xiàng)被您的 Makefile 定義。
-
處理器
+關(guān)注
關(guān)注
68文章
19854瀏覽量
234260 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141027 -
編譯器
+關(guān)注
關(guān)注
1文章
1659瀏覽量
50068
原文標(biāo)題:C語(yǔ)言中的頭文件
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何編寫(xiě)自己的C語(yǔ)言頭文件
STC單片機(jī)在KEIL編譯器中的頭文件
怎么在keil里建立頭文件
如何在C++代碼中使用C頭文件
C語(yǔ)言頭文件組織作用與包含原則詳解
C語(yǔ)言的頭文件組織與包含原則
編程中引用頭文件的幾種方法及要點(diǎn)
MCU_頭文件編寫(xiě)

C語(yǔ)言頭文件路徑的剖析

C 語(yǔ)言的頭文件路徑位置問(wèn)題

評(píng)論