2012-04-12 45 views
2

可能重複:
What are the point of header files in C?寫作規則或慣例和工作 - 頭文件使用C

我在UNIX項目。搜索了很多之後,許多人認爲使用的頭文件,因爲它們是用來編寫需要進行多個源文件之間共享代碼。

最好將定義集中在一個文件 - 頭文件中。

現在我有兩個懷疑
1)什麼是使用頭文件在簡單的.c文件的意義。
作爲從this answer我得到的頭文件就不會被編譯到目標文件。 然後發生什麼事(實際上是如何對待GCC他們)?有什麼好處? 我共享的答案想要指出什麼?

2)什麼是寫入頭文件的規則或約定。我只知道這一點:

頭文件通常只包含數據類型的定義, 函數原型和C預處理器命令。

我們可以只寫這個,即這是一個規則或慣例嗎?

誰能告訴我任何源代碼來學習如何編寫頭文件。

我能找到的只有這個 - Writing Larger Programs - 它不包含太多。或者用於編寫更好和優化的頭文件的任何其他提示或樣式。

回答

2

1)的頭文件允許傳遞.c文件,例如,定義,或在其他.c文件功能的存在,它可以讓你保持在邏輯上屬於聚集在一處的代碼之間的信息; #include指令將指定的文件當作其名稱所在的文件的一部分進行處理,這允許您節省大量多餘的鍵入操作。

2)約定是通過#define,enum和函數聲明轉換成.h文件,並在.c文件中加上實際的功能代碼(除了偶爾的靜態內聯函數)

規則是:不管編譯器會死多少都會被允許,只要它導致功能程序。這些約定或多或少地存在以幫助您將項目保持在可理解的可維護狀態。

+0

回答問題。我們可以通過編寫.c文件幷包含它來獲得所有這些功能。那爲什麼呢? 第二個問題的答案。根據你的說法,我有.h文件中的函數聲明和.c文件中的定義,如果我包含.h文件(它有聲明),那麼.c文件(帶有定義)將被包含在內,或者I必須編寫不同的include語句以包含.c文件 簡單地說,我想學習如何編寫相同的文件。有沒有什麼資料來源,書中用例子來解釋它? – 2012-04-12 12:05:48

+0

,因爲如前所述,#include包含了名爲文件的文本,如果你命名了一個.c文件,它就包含了該文件。 .h文件約定用於應該在各種.c文件之間共享的信息。如果你問「爲什麼要有.h文件」,答案基本上是能夠在.c文件之間共享代碼,而不必直接包含它們。 – tbert 2012-04-12 12:12:16

+0

正如我分享了上述問題的特定答案,這個答案更多地解釋了爲什麼要與.h共享代碼。我只需要對此進行一點解釋。 – 2012-04-12 12:20:00

0

我認爲最好的是理解爲什麼頭文件非常有用(2)以及它們如何工作(1)。然後,你可以自己決定遵循或不遵循什麼約定。

1)「include」指令的作用是指令中指向的文件完全包含在當前編譯的文件中。這應該是直截了當的。

2)通常更容易管理一個C項目拆分成多個C文件。這可能是由於大小原因(考慮具有數千行代碼的項目 - 你如何在這樣的文件中滾動),也可能是爲了管理原因(考慮多個人員在項目上工作 - 更容易分擔責任)。

在一個多C文件項目中,您將需要從其他文件中調用函數。舉個例子:

fileA.c 
int function_a() { 
    uses somewhere function_b 
} 

fileB.c 
int function_b() { 
    uses somewhere function_c 
} 

fileC.c 
int function_c() { 
    uses somewhere function_a 
} 

爲了調用任何函數,您需要先聲明它(或定義它)。要清楚:聲明是何時指定了返回類型和參數,定義是指定代碼的時候。在上面的例子中,你不可能將一個C文件「包含」到另一個文件中,這樣所有的函數在使用之前就已經被定義了。所以,你必須在函數被調用之前添加一個「聲明」。你可以在哪裏添加這樣的聲明?如果你在fileA.c中添加了一個function_c的聲明,這很難維護(想想你可以將這個場景放在幾十個文件中,這將很難跟蹤所有的聲明)。

同樣的事情適用於類型。

此問題的解決方案是爲每個C文件創建一個「頭文件」文件,其中聲明瞭程序其他模塊所需的所有函數(和類型)。這些文件可以以任何順序包含在所有需要這些功能的其他C文件中,並且是一個集中的地方,如果您更改了某個功能,則需要修改它們。

+1

因爲解決方案是爲每個C(比如A.c)文件創建一個「頭文件」(比如A.h)文件。如果我們想在不同的c(比如Bc)文件中使用這個頭文件的函數,我們必須包含這個頭文件(Ah),而不是他的c文件(Ac) – 2012-04-12 12:22:49

+0

@knoxxs是的,這也是預期的用途,也是慣例。 – HonkyTonk 2012-04-12 12:44:36