複製鏈接
請複製以下鏈接發送給好友

頭文件

鎖定
在C語言家族程序中,頭文件被大量使用。一般而言,每個C++/C程序通常由頭文件和定義文件組成。頭文件作為一種包含功能函數、數據接口聲明的載體文件,主要用於保存程序的聲明,而定義文件用於保存程序的實現。 [1-2] 
中文名
頭文件
外文名
header files
應    用
含有功能函數
領    域
C語言家族
功    能
保存程序的聲明
相對概念
定義文件

頭文件程序簡介

一般在一個應用開發體系中,功能的真正邏輯實現是以硬件層為基礎,在驅動程序、功能層程序以及用户的應用程序中完成的。
頭文件的主要作用在於多個代碼文件全局變量(函數)的重用、防止定義的衝突,對各個被調用函數給出一個描述,其本身不需要包含程序的邏輯實現代碼,它只起描述性作用,用户程序只需要按照頭文件中的接口聲明來調用相關函數或變量,鏈接器會從庫中尋找相應的實際定義代碼。 [3] 
從以上結構圖來看,頭文件是用户應用程序和函數庫之間的橋樑和紐帶。在整個軟件中,頭文件不是最重要的部分,但它是C語言家族中不可缺少的組成部分。編譯時,編譯器通過頭文件找到對應的函數庫,進而把已引用函數的實際內容導出來代替原有函數。進而在硬件層面實現功能。 [4] 

頭文件組成

C++/C程序的頭文件以“.h”為後綴。以下是假設名稱為graphics.h的頭文件:
#ifndef GRAPHICS_H//作用:防止graphics.h被重複引用
#define GRAPHICS_H
#include<....>//引用標準庫的頭文件
...
#include"..."//引用非標準庫的頭文件
...
void Function1(...);//全局函數聲明
...
inline();//inline函數的定義
...
classBox//作用:類結構聲明
{
...
};
#endif
從以上例子可以看出,頭文件一般由四部分內容組成:
(1)頭文件開頭處的版權和版本聲明;
(2)預處理塊;
(3)inline函數的定義;
(4)函數和類結構聲明等。
在頭文件中,用 ifndef/define/endif結構產生預處理塊,用 #include 格式來引用庫的頭文件。頭文件的這種結構,是利用C語言進行開發軟件所通常具備的,屬於公有知識。 [1]  [4] 

頭文件示例

conio.h不是C標準庫中的頭文件,是vc下的一個頭文件。
conio是Console Input/Output(控制枱輸入輸出)的簡寫,其中定義了通過控制枱進行數據輸入和數據輸出的函數,主要是一些用户通過按鍵盤產生的對應操作,比如getch()函數等等。
包含的函數
cgets(char *);
cprintf(const char *, ...);
cputs(const char *);
cscanf(const char *, ...);
inp(unsigned short);
inpw(unsigned short);
getch(void);
getche(void);
kbhit(void);
outp(unsigned short, int);
outpw(unsigned short, unsigned short);
putch(int);
ungetch(int);

頭文件用途

什麼樣的內容適合放在頭文件裏?
對於具有外部存儲類型的標識符,可以在其他任何一個源程序文件中經聲明後引用,此用户完全可以將一些具有外部存儲類型的標識符的聲明放在一個頭文件中。具體地説,頭文件中可以包括:用户構造的數據類型(如枚舉類型),外部變量,外部函數、常量和內聯函數等具有一定通用性或常用的量。而一般性的變量和函數定義不宜放在頭文件中。
例如:#include<stdio.h>中的頭文件stdio.h作用是讓鏈接器通過頭文件裏的函數聲明找到函數實際代碼所在的位置即所在的庫文件,這樣才能使用該函數的實際代碼,函數的實際代碼的實現過程是先讓鏈接器通過頭文件裏函數的聲明找到函數實際代碼所在的位置即所在的庫文件,再通過#include語句把鏈接器所找到的函數實際代碼用鏈接器把函數的實際代碼鏈接到當前文件即所要執行的程序中。
當然有些函數的使用不需要提供頭文件,但是在ISO/ANSI C已經對有些函數的使用必須提供哪些頭文件制定了標準。 [4] 

頭文件分類

頭文件傳統 C++

#include<assert.h>//設定插入點

#include<ctype.h>//字符處理

#include<errno.h>//定義錯誤碼

#include<float.h>//浮點數處理

#include<fstream.h>//文件輸入/輸出

#include<iomanip.h>//參數化輸入/輸出

#include<iostream.h>//數據流輸入/輸出

#include<limits.h>//定義各種數據類型最值常量

#include<locale.h>//定義本地化函數

#include<math.h>//定義數學函數

#include<stdio.h>//定義輸入/輸出函數

#include<stdlib.h>//定義雜項函數及內存分配函數

#include<string.h>//字符串處理

#include<strstrea.h>//基於數組的輸入/輸出

#include<time.h>//定義關於時間的函數

#include<wchar.h>//寬字符處理及輸入/輸出

#include<wctype.h>//寬字符分類

頭文件標準 C++

#include<algorithm>//STL通用算法

#include<bitset>//STL位集容器

#include<bits/stdc++.h>//編譯器GCC 4.8支持的萬能頭文件,基本包含所有頭文件

#include<cctype>//C字符處理

#include<cerrno>//C的錯誤報告機制

#include<clocale>

#include<cmath>//兼容C語言數學庫

#include<complex>//複數類

#include<cstdio>//C語言輸入輸出工具

#include<cstdlib>//C語言通用工具

#include<cstring>//C字符串

#include<ctime>

#include<deque>//STL雙端隊列容器

#include<exception>//異常處理類

#include<fstream>//文件輸入輸出流

#include<functional>//STL定義運算函數(代替運算符)

#include<limits>

#include<list>//STL線性列表容器

#include<map>//STL映射容器

#include<iomanip>

#include<ios>//基本輸入/輸出支持

#include<iosfwd>//輸入/輸出系統使用的前置聲明

#include<iostream>//基本輸入輸出流

#include<queue>//STL隊列容器

#include<set>//STL集合容器

#include<sstream>//基於字符串的流

#include<stack>//STL堆棧容器

#include<stdexcept>//標準異常類

#include<streambuf>//底層輸入/輸出支持

#include<string>//字符串類

#include<utility>//STL通用模板類

#include<vector>//STL動態數組容器

#include<cwchar>

#include<cwctype>
在C++中,標準庫的命名空間為std,因而包含了上述頭文件時,一般會使用下列語句: [2-3] 
using namespace std;

頭文件C99 版本

#include<complex.h>//複數處理

#include<fenv.h>//浮點環境

#include<inttypes.h>//整數格式轉換

#include<stdbool.h>//布爾環境

#include<stdint.h>//整型環境

#include<tgmath.h>//通用類型數學宏



參考資料
  • 1.    譚浩強 . C程序設計(第4版) :清華大學出版社,2010.6
  • 2.    李普曼 . C++ Primer中文版 : 電子工業出版社,2013.9
  • 3.    譚浩強 .C++程序設計(第3版) :清華大學出版社, 2015.8
  • 4.    尹德淳.C函數速查手冊 :人民郵電出版社,2009.4