很多初學(xué)朋友在看C程序開頭往往都是
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include… …
中的一個或幾個~,相信大家也知道這就是所謂的”包含頭文件”,每次我們都會這樣寫,那到底頭文件是什么,有何作用,又如何包含它?今天為大家揭開它!
(1)什么是頭文件?
我們以最簡單的hello world為例,代碼如下:
#include<stdio.h> int main() { printf(“hello world!\n”); return 0; }
這個程序就有一個文件包含。也就是stdio.h這文件,這是一個名字叫stdio,后綴為.h的文件,其實和我們在日常用的txt文本文件并無兩樣,都是我們能看懂的字符,只不過是英文而已,不信可以找到它看看,以VC6為例,可以找到VC6編譯器下VC6.0 完整綠色版\VC98\Include\目錄,即可看到stdio.h文件。
也可以直接在程序當(dāng)中,右鍵頭文件點擊打開,也可以直接打開stdio.h的內(nèi)容,如下圖:
打開stdio.h文件后,如下圖:
怎么樣,看到了嗎?這就是stdio.h的內(nèi)容,只不過英文而已!說白了,它其實和txt的文本文件差不多!只不過后綴名是.h而已!
這就是頭文件的真實面目!怎么樣,明白了嗎?
(2)頭文件的作用
那么看清之后,接下來我們來說一說,頭文件的作用吧
還是以hello world這個程序為例,相信很多朋友想過:明明就顯示一句話”Hello world”竟然足足寫了五六行代碼,而真正有用的可能就那句printf了,其他都是什么鬼,比如第一句那個#include<stdio.h> ,它是什么鬼?寫它有用嗎? 我刪了它一樣運行顯示Hello world啊!
沒錯,在VC6環(huán)境下,即使Hello world這個程序去掉第一行的文件包含也就是#include<stdio.h>這句話程序仍然可以編譯成功并且運行!但不同的是大家需要注意這個時候編譯是有一個警告的!
怎么樣?看懂了嗎? 是提示你printf這個函數(shù)沒有定義! (printf并不屬于C語言本身,不懂的同學(xué)請自行補腦),那難道加上#include<stdio.h>就算定義了嗎?答:是的
怎么講?因為在stdio.h這個頭文件中有關(guān)于printf的定義,大家可以在打開stdio.h后搜索printf
這個就是關(guān)于printf的定義(仔細搜,因為可能會搜到名字和它類似的fprintf函數(shù))
可以這么打個比方:編譯器好比是你的管家,負責(zé)家(程序)的安全,一經(jīng)發(fā)現(xiàn)任何可疑的人員都禁止進屋!而printf就這么被抓住了!你既然想讓它進屋,能做的,就是提前告訴管家我要讓它進來,也就是提前聲明。可時間一長,你發(fā)現(xiàn)有很多這樣的人想讓進來,每次都一個個聲明太累了,索性就建立一個白名單,把想讓進屋的人都寫進去,都聲明起來,到時候讓管家看白名單得了!于是乎,就有了頭文件的樣子,也就是包含頭文件。#include<stdio.h>這句話。
但凡想用到誰,就包含含有誰的頭文件。
比如你用printf函數(shù)打印東西,那你就要包含stdio.h的頭文件
如果你用pow函數(shù)算多立方,那你就要包含math.h的頭文件
如果你要用strcmp函數(shù)接收一個字符,那你就要包含string.h的頭文件
…???????????????????????????????????????????????????????????? …
怎么樣,想明白了嗎?
(3)頭文件如何被包含?
最后,在看一個C語言是如何”包含”這些頭文件的,答案就是#include這個預(yù)處理命令!
所謂預(yù)處理,即可以在編譯器編譯之前,做一些預(yù)先要做的準(zhǔn)備工作,比如宏替換、展開等等,而包含頭文件其實也就是把頭文件里的內(nèi)容原封不動的放到程序的最前面,僅此而已!
還不信?來動手試試,依舊以Hello world為例
#include<stdio.h> int? main() { printf(“hello world!\n”); return 0; }
先刪除掉#include<stdio.h>這句話,然后將stdio.h中的內(nèi)容復(fù)制到你的主函數(shù)前面,變成這樣:
然后,編譯試試,看看編譯結(jié)果!
怎么樣,這下,徹底懂了嗎?
如果對您有幫助,歡迎評論、分享!
C語言研究中心(www.sztianhecheng.cn)