C语言头文件深入理解
生活随笔
收集整理的這篇文章主要介紹了
C语言头文件深入理解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C語(yǔ)言程序中,源文件通常分為兩種:一種用于保存程序的聲明(declaration),稱為頭文件;另一種用于保存程序的實(shí)現(xiàn)(implementation),稱為定義(definition)文件。 C程序的頭文件以“.h”為后綴,C 程序的定義文件以“.c”為后綴。
可以將 .h 文件的內(nèi)容寫(xiě)在 .c 文件中,也可以將 .c 文件的內(nèi)容寫(xiě)在 .h 中,但這是很不好的習(xí)慣。許多初學(xué)者用了頭文件,卻不明其理。在此略作說(shuō)明。
在以下場(chǎng)景中會(huì)使用頭文件:
編譯時(shí)只有函數(shù)聲明沒(méi)有函數(shù)定義是完全正確的。函數(shù)聲明告訴編譯器該函數(shù)已經(jīng)存在,但是入口地址還未確定,暫時(shí)在此做個(gè)標(biāo)記,鏈接時(shí)編譯器會(huì)找到函數(shù)入口地址,并將標(biāo)記替換掉。
編譯產(chǎn)生的 .obj 文件(Linux下為 .o 文件)已經(jīng)是二進(jìn)制文件,與 .exe 的組織形式類似,只是有些函數(shù)的入口地址還未找到,程序不能執(zhí)行。鏈接的作用就是找到函數(shù)入口地址,將所有的源文件組織成一個(gè)可以執(zhí)行的二進(jìn)制文件。
關(guān)于頭文件的內(nèi)容,初學(xué)者還必須注意:
好的風(fēng)格是成功的關(guān)鍵,版本申明、函數(shù)功能說(shuō)明、注釋等是C語(yǔ)言程序的一部分。不養(yǎng)成很好的習(xí)慣則不能成為C語(yǔ)言高手(專業(yè)人員)。
C標(biāo)準(zhǔn)庫(kù)中,每一個(gè)庫(kù)函數(shù)都在一個(gè)頭文件中聲明,可以通過(guò) #include 預(yù)處理命令導(dǎo)入。
頭文件只是聲明,不占內(nèi)存空間,編譯時(shí)會(huì)被合并到源文件;要想知道它的具體實(shí)現(xiàn),要看頭文件所聲明的函數(shù)是在哪個(gè) .c 文件里定義的,然后查看源代碼。
C標(biāo)準(zhǔn)庫(kù)共包含 15 個(gè)頭文件,可以分為 3 組,如何正確并熟練的使用它們,可以相應(yīng)的可區(qū)分出 3 個(gè)層次的程序員:
各個(gè)頭文件的具體內(nèi)容請(qǐng)查看: C語(yǔ)言標(biāo)準(zhǔn)庫(kù)
C語(yǔ)言頭文件具有以下幾個(gè)特性:
等冪性是很容易實(shí)現(xiàn)的,對(duì)于大多數(shù)的頭文件可以使用宏保護(hù)。例如,在 stdio.h 中可以有如下的宏定義:#ifndef _STDIO_H #define _STDIO_H /* 主要實(shí)現(xiàn)部分 */ #endif
在C程序員中所達(dá)成的一個(gè)約定是:C源文件的開(kāi)頭部分要包含所有要用到的頭文件。在 #include 指令之前只能有一句注釋語(yǔ)句。引入的頭文件可以按任意順序排列。
如果我們自己編寫(xiě)的頭文件可能會(huì)用到標(biāo)準(zhǔn)頭文件中的定義或者聲明,最好把標(biāo)準(zhǔn)頭文件包含在自定義頭文件的開(kāi)頭。這樣,就不會(huì)在程序中忘記引入該標(biāo)準(zhǔn)頭文件,也不會(huì)有順序問(wèn)題。這正是利用了頭文件的等冪性。
注意一個(gè)約定,引入標(biāo)準(zhǔn)頭文件用尖括號(hào),引入自定義頭文件用雙引號(hào),例如:#include <stdio.h> #include "myFile.h"
C語(yǔ)言庫(kù)函數(shù)是頭文件的最佳實(shí)踐,仔細(xì)閱讀各個(gè)頭文件的內(nèi)容,尤其是 stdio.h,能夠?qū)W到很多東西。
如果忘記 VC6.0 的安裝目錄或者頭文件不在安裝目錄下,可以通過(guò)以下方式找到:
1) 在工具欄中點(diǎn)擊“工具”按鈕
2) 在二級(jí)菜單中選擇“選項(xiàng)”
3) 在彈出的對(duì)話框中選擇“目錄”標(biāo)簽
4) 然后選擇名字為“目錄”的下拉菜單中的“Include files”一項(xiàng),如下圖所示:
可以將 .h 文件的內(nèi)容寫(xiě)在 .c 文件中,也可以將 .c 文件的內(nèi)容寫(xiě)在 .h 中,但這是很不好的習(xí)慣。許多初學(xué)者用了頭文件,卻不明其理。在此略作說(shuō)明。
在以下場(chǎng)景中會(huì)使用頭文件:
- 通過(guò)頭文件來(lái)調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可。用戶只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功 能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。
- 多文件編譯。將稍大的項(xiàng)目分成幾個(gè)文件實(shí)現(xiàn),通過(guò)頭文件將其他文件的函數(shù)聲明引入到當(dāng)前文件。
- 頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。
編譯時(shí)只有函數(shù)聲明沒(méi)有函數(shù)定義是完全正確的。函數(shù)聲明告訴編譯器該函數(shù)已經(jīng)存在,但是入口地址還未確定,暫時(shí)在此做個(gè)標(biāo)記,鏈接時(shí)編譯器會(huì)找到函數(shù)入口地址,并將標(biāo)記替換掉。
編譯產(chǎn)生的 .obj 文件(Linux下為 .o 文件)已經(jīng)是二進(jìn)制文件,與 .exe 的組織形式類似,只是有些函數(shù)的入口地址還未找到,程序不能執(zhí)行。鏈接的作用就是找到函數(shù)入口地址,將所有的源文件組織成一個(gè)可以執(zhí)行的二進(jìn)制文件。
關(guān)于頭文件的內(nèi)容,初學(xué)者還必須注意:
- 頭文件中可以和C程序一樣引用其它頭文件,可以寫(xiě)預(yù)處理塊,但不要寫(xiě)具體的語(yǔ)句。
- 可以申明函數(shù),但不可以定義函數(shù)。
- 可以申明常量,但不可以定義變量。
- 可以“定義”一個(gè)宏函數(shù)。注意:宏函數(shù)很象函數(shù),但卻不是函數(shù)。其實(shí)還是一個(gè)申明。
- 結(jié)構(gòu)的定義、自定義數(shù)據(jù)類型一般也放在頭文件中。
- #include <filename.h>,編譯系統(tǒng)會(huì)到環(huán)境指定的目錄去引用。#include "filename.h",系統(tǒng)一般首先在當(dāng)前目錄查找,然后再去環(huán)境指定目錄查找。
好的風(fēng)格是成功的關(guān)鍵,版本申明、函數(shù)功能說(shuō)明、注釋等是C語(yǔ)言程序的一部分。不養(yǎng)成很好的習(xí)慣則不能成為C語(yǔ)言高手(專業(yè)人員)。
C標(biāo)準(zhǔn)庫(kù)中,每一個(gè)庫(kù)函數(shù)都在一個(gè)頭文件中聲明,可以通過(guò) #include 預(yù)處理命令導(dǎo)入。
頭文件只是聲明,不占內(nèi)存空間,編譯時(shí)會(huì)被合并到源文件;要想知道它的具體實(shí)現(xiàn),要看頭文件所聲明的函數(shù)是在哪個(gè) .c 文件里定義的,然后查看源代碼。
C標(biāo)準(zhǔn)庫(kù)共包含 15 個(gè)頭文件,可以分為 3 組,如何正確并熟練的使用它們,可以相應(yīng)的可區(qū)分出 3 個(gè)層次的程序員:
- 合格程序員:<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>
- 熟練程序員:<assert.h>、<limits.h>、<stddef.h>、<time.h>
- 優(yōu)秀程序員:<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>
各個(gè)頭文件的具體內(nèi)容請(qǐng)查看: C語(yǔ)言標(biāo)準(zhǔn)庫(kù)
C語(yǔ)言頭文件具有以下幾個(gè)特性:
- 冪等性。可以多次包含相同的標(biāo)準(zhǔn)頭文件,但效果與只包含一次相同。
- 相互獨(dú)立。任何標(biāo)準(zhǔn)頭文件的正常工作都不需要以包含其他標(biāo)準(zhǔn)頭文件為前提。也沒(méi)有任何標(biāo)準(zhǔn)頭文件包含了其他標(biāo)準(zhǔn)頭文件。
- 和文件級(jí)別的聲明等同。必須先把某標(biāo)準(zhǔn)頭文件包含到你的程序中, 然后才能使用該頭文件已定義或聲明的東西。不能在聲明中包含標(biāo)準(zhǔn)頭文件。并且,也不能在包含標(biāo)準(zhǔn)頭文件之前用宏定義去代替關(guān)鍵字。
等冪性是很容易實(shí)現(xiàn)的,對(duì)于大多數(shù)的頭文件可以使用宏保護(hù)。例如,在 stdio.h 中可以有如下的宏定義:
在C程序員中所達(dá)成的一個(gè)約定是:C源文件的開(kāi)頭部分要包含所有要用到的頭文件。在 #include 指令之前只能有一句注釋語(yǔ)句。引入的頭文件可以按任意順序排列。
如果我們自己編寫(xiě)的頭文件可能會(huì)用到標(biāo)準(zhǔn)頭文件中的定義或者聲明,最好把標(biāo)準(zhǔn)頭文件包含在自定義頭文件的開(kāi)頭。這樣,就不會(huì)在程序中忘記引入該標(biāo)準(zhǔn)頭文件,也不會(huì)有順序問(wèn)題。這正是利用了頭文件的等冪性。
注意一個(gè)約定,引入標(biāo)準(zhǔn)頭文件用尖括號(hào),引入自定義頭文件用雙引號(hào),例如:
C語(yǔ)言庫(kù)函數(shù)是頭文件的最佳實(shí)踐,仔細(xì)閱讀各個(gè)頭文件的內(nèi)容,尤其是 stdio.h,能夠?qū)W到很多東西。
在 VC6.0 中找到頭文件
C標(biāo)準(zhǔn)頭文件,例如 stdio.h、string.h 等在 VC6.0 的安裝目錄中是可以找到的。我的 VC6.0 安裝在?C:\Program Files\Microsoft Visual Studio\ 目錄,那么 VC6.0 附帶的所有頭文件(包括但不限于標(biāo)準(zhǔn)頭文件)都在?C:\Program Files\Microsoft Visual Studio\VC98\Include\ 目錄下。如果忘記 VC6.0 的安裝目錄或者頭文件不在安裝目錄下,可以通過(guò)以下方式找到:
1) 在工具欄中點(diǎn)擊“工具”按鈕
2) 在二級(jí)菜單中選擇“選項(xiàng)”
3) 在彈出的對(duì)話框中選擇“目錄”標(biāo)簽
4) 然后選擇名字為“目錄”的下拉菜單中的“Include files”一項(xiàng),如下圖所示:
轉(zhuǎn)自:http://see.xidian.edu.cn/cpp/html/2570.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的C语言头文件深入理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: visual studio 调试时提示
- 下一篇: 全国计算机等级考试 架构师的设计模式