2010-10-28 58 views

回答

8

這裏有幾個用例。最明顯的是你的主程序很少需要頭文件。

第二個是你的不要對每個C文件都有一個標題。我已經把庫之前(比方說,一個B樹庫這個答案的目的),其中每個獨立的功能是其自己的源文件,但有一個圖書館,寬頭文件,是這樣的:

btree.h 
btree_priv.h 
btreeInit.c 
btreeDestroy.c 
btreeConfig.c 

和等等。專用頭文件用於需要在代碼之間共享的內容,但不會在API中發佈。

+0

所以我想這個答案的一個必然結果是門面模式往往會導致非一對一的.c到.h關係? – Tommy 2012-02-11 15:43:12

5

最明顯的是當.c完全自包含,並且不需要爲其他.c文件創建原型或外部文件。這基本上只適用於非常小的程序或通過def文件導出到預定義界面的插件。

1

如果您不需要.h文件中的聲明,但實際上永遠不會。

3

當.c文件包含不需要被任何代碼使用的數據時。

無可否認這是罕見的 - 但它可能發生。例如,我已經在嵌入式設備中完成這項工作,用引導圖形填充視頻幀緩衝區。

3

如果您將程序劃分爲多個模塊,通常會有一個「main」模塊,其中包含main()函數以及其他一些內容。如果此模塊沒有任何應該被其他模塊調用或使用的內容,則不需要在.h文件中導出接口。

5

我見過大量的代碼庫,其中一個.h文件定義了某個組件的接口,並且有幾個.c文件實現它。爲了可維護性的原因,這個實現被分成幾個文件,並且試圖在一些邏輯範圍內進行。有人可能會爭辯說,這樣一個邏輯界限可以用來將組件分成子組件,因此有多個頭文件,但是設計決策很少是白色事物,有時這種方法確實有意義。

1

很多時候,即使我不期望其他代碼必須訪問它,我也會爲'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」。不知道如果有多個,該怎麼辦。

3

我認爲.c和.h文件之間的1對1映射是一個不好的開始假設。拋出並開始新鮮。 :D

不同地看着你的問題,你可能會問:「什麼時候創建一個頭文件是合適的?」

我會建議以下,其中術語「代碼模塊」是一個或多個相關.c文件組(通常是目錄):

  1. 創建公共接口/定義一個報頭必須可用於其他代碼模塊。
  2. 爲必須在代碼模塊內共享但不與其他代碼模塊共享的專用接口/定義創建標頭。

這些是你唯一需要的頭文件。如果這些都不是必需的,那麼你不需要頭。

一些編碼人員喜歡人爲地將原型/宏/ typedefs/etc分隔成獨立於.c中的全局變量/函數的.h。我建議不要這種方法,並建議在一個文件中包含所有相關的功能。然後,根據需要移動到標題,以防止在其他.c文件中出現'extern'。

相關問題