c語言標頭檔案
每個c++/c程式通常分為兩個檔案。乙個檔案用於儲存
程式的宣告(declaration)
,稱為標頭檔案。
另乙個檔案用於儲存
程式的實現(implementation)
,稱為定義(definition)檔案。
c++/c程式的標頭檔案以「.h」為字尾,
c程式的定義檔案以「.c」為字尾,
c++程式的定義檔案通常以「.cpp」為字尾(也有一些系統以「.cc」或「.cxx」為字尾)。
編譯器的編譯單位是.cpp檔案,對每個cpp檔案都生成乙個.obj的目標檔案,最後link連線成.exe可執行檔案。
標頭檔案主要是對函式、全域性變數的宣告和一些巨集的定義,
.h檔案是不參與編譯的
,#include巨集的作用就是預處理的時候在使用這句話的地方用.h檔案的內容替換掉這句話。
由於c++對函式和變數的預設作用域都是檔案級的(extern),也即是乙個cpp檔案是可以引用另乙個cpp檔案中定義的函式或者全域性變數的,只要在包含相應的
宣告即可,在link程式連線.obj檔案的時候會自動替我們找到對應的定義。
在編譯器編譯的時候,cpp檔案定義的全域性變數和函式在生成.obj檔案中都有相應的外部標號,正是通過這個標號,link才能找到對應的定義,完成呼叫前的指向。
如果用static關鍵字定義的變數和函式,則表明此變數和函式是檔案內部的,編譯器不產生外部標號,那麼即使在別的.cpp檔案中有此宣告,在link的階段也會報錯。
另外類的定義跟函式和變數的定義有所不同,類的定義只是告知編譯器此種型別所需的位元組數和其他資訊,並不分配記憶體空間,不能在同乙個標頭檔案中包含其定義,因為這樣的話在編譯器就不知道如何選擇對應類的資訊,而函式和變數是在同個檔案可以重複包含的。
寫標頭檔案:
標頭檔案由三部分內容組成:
(1)標頭檔案開頭處的版權和版本宣告。
(2)預處理塊。
為了防止標頭檔案被重複引用,應當用ifndef/define/endif結構產生預處理塊。
(3)函式和類結構宣告等。
建議:1. 系統中為每個功能模組建立乙個.h標頭檔案。
乙個功能模組實現系統的乙個方面功能,它可能由多個.c和.asm檔案來實現,為它建立乙個.h標頭檔案。
2. 把乙個模組的公共介面的函式宣告放到.h檔案中。這是public函式。
3. 不要在.h標頭檔案中放私有函式或私有巨集, 把它們放到.c檔案中,並用static修飾函式。
4. 在.h標頭檔案中,不要有執行的**和變數宣告,除非是inline函式。
5. 在.h標頭檔案中,不要暴露變數,在.c中宣告變數,如果外部需要使用這個變數,在.h中使用extern關鍵字來暴露變數。
6. 在.h標頭檔案中,不要暴露任何特定模組相關的資料結構的內部格式。
在.h頭中,不要宣告具體資料結構,如struct foo,而是把它放到.c中,如果模組中需要這個結構輸入或輸出,在頭中定義乙個型別typedef struct foo module_type,這樣客戶模組可以建立它的例項。客戶模組不必知道具體的foo結構的內部細節。
標頭檔案的作用:
(1)通過標頭檔案來呼叫庫功能。在很多場合,源**不便(或不准)向使用者公布,只要向使用者提供標頭檔案和二進位制的庫即可。使用者只需要按照標頭檔案中的介面宣告來呼叫庫功能,而不必關心介面怎麼實現的。編譯器會從庫中提取相應的**。
(2)標頭檔案能加強型別安全檢查。如果某個介面被實現或被使用時,其方式與標頭檔案中的宣告不一致,編譯器就會指出錯誤,這一簡單的規則能大大減輕程式設計師除錯、改錯的負擔。
編譯預處理 #ifnde, #define, #endif
C語言標頭檔案
早期的程式語言如 basic fortran 沒有標頭檔案的概念,c c 語言的初學者雖然會 用使用標頭檔案,但常常不明其理。這裡對頭檔案的作用略作解釋 1 通過標頭檔案來呼叫庫功能。在很多場合,源 不便 或不准 向使用者公布,只要向使用者提供標頭檔案和二進位制的庫即可。使用者只需要按照標頭檔案中的...
C語言標頭檔案
標頭檔案結構 標頭檔案一般由3部分組成 1.標頭檔案的開頭版本和版權的宣告 2.預處理塊 3.函式和類結構的宣告 question1 include和 include a.h 有什麼區別?include引用的是標準庫的標頭檔案,也就是說編譯器是從標準庫進行開始搜尋,而 include a.h 則是屬...
C語言標頭檔案
件一般放宣告,是不放具體函式的 為了防止標頭檔案被重複包含,標頭檔案的編寫需要符合一定的格式,比如在開頭利用某巨集是否被定義來判斷是否要包含該標頭檔案。假設有一頭檔案叫example.h,它的編寫格式如下 ifndef example h define example h 函式宣告 endif於此同...