2016-02-12 238 views
0

我是否需要在頭文件中聲明.c文件中使用的所有函數,或者我可以在.c文件中聲明並定義它嗎?如果是這樣,在這種情況下.c文件中的定義是否也算作聲明呢?是否需要在頭文件中聲明所有C函數

+3

編譯器不關心聲明的位置。頭文件簡單地合併到'.c'文件中,然後以相同的方式處理它們。頭文件的存在方便起見,因此您不必在多個文件中重複相同的事情。 – Barmar

回答

3

對於編譯器來說,.h.c文件中是否出現聲明並不重要,因爲編譯器會看到預處理的表單。

對於人類開發閱讀並促進你的代碼,它是要好得多(避免複製&粘貼相同的聲明兩次)把在多個翻譯單元(即.c文件)所使用的任何函數的聲明一些#include-d頭。

你可以在使用它之前定義一個函數。

順便說一句,你甚至可以避免聲明你正在調用的函數(它默認爲返回int用於傳統目的),但這是糟糕的口味和過時的編碼方式(並且大多數編譯器可以在這種情況下發出警告) 。

1

這兩個問題的答案都是肯定的。您可以在頭文件和.c文件中聲明c函數。與定義相同。但是,如果您在頭文件中定義它,則在編譯期間可能會遇到輕微問題。

0

不,這不是必需的。

頭文件的原因是將接口從實現中分離出來。頭文件聲明瞭「什麼」類(或正在實現的任何內容)將執行什麼操作,而.c文件則定義了它將如何執行這些功能。

這減少了依賴關係,以便使用頭的代碼不一定需要知道實現的所有細節和任何其他類/頭只需要。這將減少編譯時間以及實現中的某些內容所需的重新編譯量。

2

我需要聲明我在.c文件使用所有功能於一身的頭文件, 或可我只是聲明和.c文件定義的權利呢?

您在第一個問題中使用了「use」,在下一個問題中使用了「define」。它們是有區別的。

void foo() 
{ 
    bar(10); 
} 

這裏,foo被定義並且被用於bar。您應該聲明bar。如果您未聲明bar,則編譯器會對其返回類型進行假設。

您可以在.c文件中聲明bar,或將.h文件中的聲明和.c文件中的.h文件添加到#include中。無論你使用第一種方法還是第二種方法都取決於你。如果您在多個.c文件中使用聲明,最好將它放在.h文件中。

您可以在沒有聲明的情況下定義foo

如果是這樣,在這種情況下,.c文件中的定義是否也算作聲明呢?

每個函數定義也算作聲明。

1

默認情況下,函數具有外部鏈接。這意味着它可能會被用在幾個編譯單元中。

然而,有時一些形成其他函數的實現的輔助函數並沒有被設計用於許多編譯單元。用關鍵字static聲明的這些函數具有內部鏈接。

通常它們是在某個.c模塊內部聲明和定義的,並且在其他編譯單元中不可見。

1

需要在單獨的頭文件中聲明函數的一個場合是當其中一個正在爲其他開發人員創建一個庫時使用。一些庫作爲封閉源代碼分發,並作爲庫文件(* .dll/* .so ...)和頭文件提供給您。

頭文件將包含所有公開要求的結構,枚舉和數據類型等

的所有可公開訪問的函數的聲明和定義沒有這個頭文件中的第三方庫的用戶不知道如何與庫接口文件,因此將無法鏈接它。

但是對於不適合其他人使用的小型C程序,不可以將所有內容轉儲到C文件中並構建它。雖然你可能會在多年後詛咒自己,當你需要維護代碼:)