「在編譯器只認識.c(.cpp))檔案,而不知道.h是何物的年代,那時的人們寫了很多的.c(.cpp)檔案,漸漸地,人們發現在很多.c(.cpp)檔案中的宣告語句就是相同的,但他們卻不得不乙個字乙個字地重複地將這些內容敲入每個.c(.cpp)檔案。但更為恐怖的是,當其中乙個宣告有變更時,就需要檢查所有的.c(.cpp)檔案。要更深入理解這個問題我們需要對編譯器原理有一定理解,編譯器的作用是將程式**轉換成機器能夠直接執行的機器碼。主要有以下四個過程:於是人們將重複的部分提取出來,放在乙個新檔案裡,然後在需要的.c(.cpp)檔案中敲入#include ***x這樣的語句。這樣即使某個宣告發生了變更,也再不需要到處尋找與修改了。因為這個新檔案,經常被放在.c(.cpp)檔案的頭部,所以就給它起名叫做「標頭檔案」,副檔名是.h。
在我們語言的初學階段,往往我們的程式只有乙個.c的檔案或這很少的幾個,這時我們就很少遇到頭檔案組織這個頭疼的問題,隨著我們程式的增加,** 量到了幾千行甚至幾萬行,檔案數也越來越多。這時這些檔案的組織就成了乙個問題,其實說白了這些檔案的組織問題從理論上來說是軟體工程中的模組設計等等的問題。」 —— [ 引自「c 語言專案中.h檔案和.c檔案的關係」 ]
1.標頭檔案的預編譯,預處理
編譯器在編譯源**時,會先編譯標頭檔案,保證每個標頭檔案只被編譯一次。
在預處理階段,編譯器將c檔案中引用的標頭檔案中的內容全部寫到c檔案中。
2.詞法和語法分析(查錯)
3.編譯(彙編**,.obj檔案)
轉化為彙編碼,這種檔案稱為目標檔案。字尾為.obj。
4.鏈結(二進位制機器碼,.exe檔案)
將彙編**轉換為機器碼,生成可執行檔案。
在編譯過程中,.h檔案中的所有內容會被寫到包含它的.c檔案中,而所有的.c檔案以乙個共同的main函式作為可執行程式的入口。
在.h檔案中編寫函式實現依然可以正常編譯執行,相當於所有.h的內容最後都被寫到了main.c檔案中。但是為了邏輯性、易於維護性以及一些其他目的,一般在.h檔案中寫函式的宣告,在.c檔案中編寫函式的實現。
c語言中 h檔案的作用
h中一般放的是同名.c檔案中定義的變數 陣列 函式的宣告,需要讓.c外部使用的宣告。h檔案作用 1.方便開發 包含一些檔案需要的共同的常量 結構 型別定義,函式宣告,變數宣告。2.使函式的作用域從函式宣告的位置開始,而不是函式定義的位置。3.通過標頭檔案來呼叫庫功能。在很多場合,源 不便公開,只能向...
c語言中的 c檔案和 h檔案
大神的詳細解讀 傳送門 記錄下一點點自己對兩個檔案的理解 函式宣告可以有多分,但函式定義只能有乙份。所以一般不在標頭檔案裡面定義函式,因為同乙個程式的多個 檔案可能都會包含這個標頭檔案。但c 中的inline函式是個例外,得定義在標頭檔案中。為了能夠擴充套件inline函式的內容,在每個呼叫點上,編...
c語言中 h檔案和 c檔案的關係
在編譯器只認識.c cpp 檔案,而不知道.h是何物的年代,那時的人們寫了很多的.c cpp 檔案,漸漸地,人們發現在很多.c cpp 檔案中的宣告語句就是相同的,但他們卻不得不乙個字乙個字地重複地將這些內容敲入每個.c cpp 檔案。但更為恐怖的是,當其中乙個宣告有變更時,就需要檢查所有的.c c...