百度百科是這樣定義的:頭文件作為一種包含功能函數、數據接口聲明的載體文件,主要用於保存程序的聲明(declaration),而定義文件用於保存程序的實現 (implementation)。 .c就是你寫的程序文件。
其實我一開始對頭文件的理解和庫差不多,比如我在程序前面加上了math.h這個頭文件,我就能在我的程序里調用一些有關數學的函數。當然了我的理解並不正確,其實頭文件的主要作用在於多個代碼文件全局變量(函數)的重用、防止定義的沖突,對各個被調用函數給出一個描述,其本身不需要包含程序的邏輯實現代碼,它只起描述性作用,用戶程序只需要按照頭文件中的接口聲明來調用相關函數或變量,鏈接器會從庫中尋找相應的實際定義代碼。
對於頭文件和庫的區別我們可以這樣理解:就是頭文件提供的是一個函數的聲明,並沒有這個函數具體代碼,而庫呢就是存放這個函數的具體實現代碼。
c語言在編譯過程中會經過預處理(需要頭文件),編譯,匯編,鏈接(需要庫文件)。執行的時候可能還有動態鏈接過程。在編譯的時候只要有頭文件的聲明就可以了,在鏈接的時候,把已經編譯好的.obj和現有的.lib文件進行鏈接,這時就可以最終生成可執行文件了。
其實頭文件與其實現文件或相應lib文件都沒有直接的聯系。頭文件是告訴編譯器函數是如何去調用如何返回的,所有實現都是分別編譯,最后在鏈接階段鏈在一起。頭文件包含聲明,庫文件包含實現或者與動態庫的連接 。所以如果在代碼里要用到這些函數那么就要包含頭文件,編譯的時候才能知道這些函數的原形,在進行代碼連接的時候就需要庫文件了,這時連接器就把函數的實現代碼(靜態庫)連接到你的程序或者將你的函數調用連接到相應的動態庫中對應函數, lib是靜態庫,編譯的時候代碼直接插入到你的程序 ,編譯的時候,只是產生一些調用動態庫內代碼的導入表,真正運行的時候是調用的動態庫內的代碼。