回答
這裏有幾個用例。最明顯的是你的主程序很少需要頭文件。
第二個是你的不要對每個C文件都有一個標題。我已經把庫之前(比方說,一個B樹庫這個答案的目的),其中每個獨立的功能是其自己的源文件,但有一個圖書館,寬頭文件,是這樣的:
btree.h
btree_priv.h
btreeInit.c
btreeDestroy.c
btreeConfig.c
和等等。專用頭文件用於需要在代碼之間共享的內容,但不會在API中發佈。
最明顯的是當.c
完全自包含,並且不需要爲其他.c
文件創建原型或外部文件。這基本上只適用於非常小的程序或通過def文件導出到預定義界面的插件。
如果您不需要.h
文件中的聲明,但實際上永遠不會。
當.c文件包含不需要被任何代碼使用的數據時。
無可否認這是罕見的 - 但它可能發生。例如,我已經在嵌入式設備中完成這項工作,用引導圖形填充視頻幀緩衝區。
如果您將程序劃分爲多個模塊,通常會有一個「main」模塊,其中包含main()函數以及其他一些內容。如果此模塊沒有任何應該被其他模塊調用或使用的內容,則不需要在.h文件中導出接口。
我見過大量的代碼庫,其中一個.h
文件定義了某個組件的接口,並且有幾個.c
文件實現它。爲了可維護性的原因,這個實現被分成幾個文件,並且試圖在一些邏輯範圍內進行。有人可能會爭辯說,這樣一個邏輯界限可以用來將組件分成子組件,因此有多個頭文件,但是設計決策很少是白色事物,有時這種方法確實有意義。
很多時候,即使我不期望其他代碼必須訪問它,我也會爲'main'創建一個頭文件,因爲(1)調試版本最終會在主模塊之外(2)由於(嵌入式系統)編譯器限制,主模塊最終不得不分裂。每個.c文件包含它自己的.h文件的模式足夠強大,以至於我經常創建幾乎空的.h文件,即使是定義了代碼中未引用的東西的.c文件(例如中斷跳轉表等)。
當一個文件包含多個程序生成的文件或者包含需要多次編譯的文件(例如,文件)時,命名約定會變得更復雜一些。我的一個項目有兩個電機,其代碼相同,只是它們使用不同的I/O端口和不同的變量;我motor.c文件包含:
#define LOCK L0 #include "motor.i" #undef LOCK #define LOCK L1 #include "motor.i" #under LOCK
注意,在這個特定的嵌入式編譯器, - >操作是非常低效的,所以如下語句:
L0.speed++;
將編譯成一個指令,而聲明一樣:
L0->speed++;
將轉化爲五個指令,如果「速度」是在結構中的第一項,或七個,如果它佔據任何其他職位。因此,複製具有恆定可解析地址的代碼比使一個例程處理兩個電動機的代碼快得多,且更節省空間。
如果有一個與.c文件關聯的額外文件,並且它包含真實代碼,我會將其命名爲「.i」。不知道如果有多個,該怎麼辦。
我認爲.c和.h文件之間的1對1映射是一個不好的開始假設。拋出並開始新鮮。 :D
不同地看着你的問題,你可能會問:「什麼時候創建一個頭文件是合適的?」
我會建議以下,其中術語「代碼模塊」是一個或多個相關.c文件組(通常是目錄):
- 創建公共接口/定義一個報頭必須可用於其他代碼模塊。
- 爲必須在代碼模塊內共享但不與其他代碼模塊共享的專用接口/定義創建標頭。
這些是你唯一需要的頭文件。如果這些都不是必需的,那麼你不需要頭。
一些編碼人員喜歡人爲地將原型/宏/ typedefs/etc分隔成獨立於.c中的全局變量/函數的.h。我建議不要這種方法,並建議在一個文件中包含所有相關的功能。然後,根據需要移動到標題,以防止在其他.c文件中出現'extern'。
- 1. 如何統一js文件,什麼時候關於jQuery插件
- 2. fstream文件I/O問題 - 什麼時候關閉文件流
- 3. * .xib,* .m和* .h文件如何關聯?
- 4. .dll,.lib,.h文件有什麼區別?
- 5. Favicon顯示什麼時候測試文件,但沒有託管
- 6. 爲什麼一些.h文件有兩個類?
- 7. 你怎麼知道什麼時候在Python中關閉文件?
- 8. Android:什麼時候生成.APK文件?
- 9. 什麼時候.xlsb文件比* .xlsx大?
- 10. Python - 它什麼時候寫入文件
- 11. 什麼時候getTempDirectory文件被刪除?
- 12. 什麼時候刷新.pyc文件?
- 13. .csproj文件什麼時候更新?
- 14. CPP | .h文件(C++)
- 15. 關於C程序中的.c文件和.h文件?
- 16. 什麼時候c/C++項目需要配置文件?
- 17. 知道什麼時候一個文件上傳到Dropbox的
- 18. 爲什麼頭文件Head1.h不能包含一個包含Head1.h的頭文件Head2.h?
- 19. 什麼時候選擇關聯查詢
- 20. 有沒有辦法在.c文件而不是.h文件中定義C內聯函數?
- 21. C#文件類型關聯
- 22. 在`reader`中使用`line-seq`,文件什麼時候關閉?
- 23. 什麼時候在HDFS中關閉文件
- 24. 什麼時候明確關閉文件句柄?
- 25. 當我添加一個新的.c文件時,在Xcode中創建的.h文件是什麼?
- 26. C++中的類(cpp文件&h文件)
- 27. C++什麼時候編譯類對象文件?
- 28. dde文件關聯的最佳.net替代文件是什麼?
- 29. 什麼時候使用UML直接關聯與正常關聯
- 30. 爲什麼non-extern可以在C/C++中使用.h文件?
所以我想這個答案的一個必然結果是門面模式往往會導致非一對一的.c到.h關係? – Tommy 2012-02-11 15:43:12