2016-04-29 59 views
0

爲什麼函數的定義不會與它們的聲明一起寫入同一個「some.h」文件中?如果我們不是從「some.c」文件中分離出「some.h」文件,會發生什麼?爲什麼函數的定義與聲明分離?

+0

當您嘗試鏈接多個翻譯單元(包含標題)時,您將會遇到「多重定義」錯誤。 –

+0

感謝您提出這個問題,我一直在想這件事。我們的老師沒有解釋這一點的必要性。 @Kerrek爲什麼不讓函數在編譯器中隱式內聯呢? –

+0

@ JohannesSchaub-litb:歷史?處理內聯定義更復雜並且需要實現,因此不需要從C89編譯器中獲取它... –

回答

1

所以,一個人知道最低限度他需要知道。 (這使得編譯速度更快,名稱衝突的機會更小,管理代碼的能力更容易等)。如Kerrek SB的this comment所述:如果將源代碼和代碼混合使用,則將大型項目劃分爲模塊很困難。例如,您可以編譯一個庫(包含定義)並將其提供給您的客戶(只關注接口)以及聲明(Headers),並且他將能夠使用它而無需知道實施來源。 (這樣你也可以隱藏實現細節)

沒有標題,他不知道庫中可用函數的用法。雖然不是強制性的,但建議將聲明和定義分開。

+0

I.e它只是用於編寫明確的代碼?但從編譯器來看它沒有關係,它們是否分開? –

+0

@DavidTsaturyan它的確如此。一個管理良好的項目編譯速度更快。 –

0

其實嘛,分離聲明和定義不是強制性的,而實際上一切都在思考這個問題分開使用和實施,這對於促進抽象,可重用性,模塊化等

如果你不這樣做遵循這些規則,那麼您將很快面臨多種定義的編譯問題等。