頭文件通過預(yù)處理器標(biāo)識(shí)符(include)而成為我們程序的一部分。預(yù)處理器標(biāo)識(shí)符用“#”來標(biāo)識(shí)。這個(gè)符號(hào)放在程序的最開始 的第一行的位置上。處理這些標(biāo)識(shí)符的程序稱為預(yù)處理器(preprocessor),一般綁定在編譯器中。
include 指示符讀入指定文件的內(nèi)容,它有兩種格式:
#include<iostream>
#include"iostream"
如果文件名用"<"和 ">"括起來。那么表示這個(gè)文件是一個(gè)工程文件或者標(biāo)準(zhǔn)的頭文件。查找過程會(huì)檢查預(yù)定義的目錄。我們可以通過設(shè)置搜索路徑環(huán)境變量或者命令行選項(xiàng)來修改這些目錄。
如果文件是用引號(hào)括起來的,就表示這個(gè)文件是用戶自己提供的,那么查找這個(gè)文件的時(shí)候,就可以從當(dāng)前的目錄開始查找,
被包含的文件可能還會(huì)包含#include,一個(gè)同文件可能會(huì)被同一個(gè)原文件多次的包含。條件指示符可以防止這種頭文件被重復(fù)包含的情況。
例如:
#ifndef BOOKSTORE_H
#define BOOKSTORE_H
/*bookstore.h的內(nèi)容*/
#endif
條件指示符#ifndef用于檢查預(yù)編譯器常量BOOKSTORE_H是否已經(jīng)被定義了(習(xí)慣上我們把與編譯器常量用大寫表示)。如果BOOKSTORE_H沒有在前面定義的話,那么#ifndef 的值為真。那么#ifndef 和#endif中間的語句
為了保證頭文件只被處理一次。把如下的的頭文件放在#ifndef的后面。
#define指示符放在#ifndef的后面。這樣頭文件在第一次包含的時(shí)候,BOOOKSTORE_H就被定義了,那么以后如果在出現(xiàn)包含頭文件的情況,則 #ifndef的值就為假了。
只要不存在“兩個(gè)必須包含的頭文件使用同一個(gè)預(yù)編譯器常量”這種情況,那么這種機(jī)制就會(huì)很好的運(yùn)行。
#ifdef指示符用來判斷一個(gè)預(yù)定義器常量是否已經(jīng)被定義了,以便有條件的包含程序代碼。
注意:
#ifndef條件指示符和ifdef指示符的區(qū)別。
前者用于防止頭文件被重復(fù)包含,而后者則是為了判斷一下一個(gè)預(yù)定義器常量是否被定義了。
我們?cè)诰幾g程序的時(shí)候,可以使用-D,在——D的后面寫上預(yù)處理器常量的名字,這樣就可以在命令行中定義一個(gè)與處理器的常量了。
$CC -DBOOKSTORE_H main.c
也可以用#define指示符來定義一個(gè)預(yù)處理器的常量。