2016-06-10 48 views
-3

我正在練習avr,並且在創建庫時最好創建一個頭文件,該頭文件包含函數聲明和包含代碼的函數文件(函數定義),或者僅創建一個頭文件同時包含的聲明和創建庫

+1

不要將函數放在頭文件中。他們被稱爲__header文件___是有原因的。 –

+1

你的問題是一個根本性的錯誤。它假定這兩種方法之間絕對沒有區別。這不是真的。有代碼方面的主要後果,你需要充分理解它們,以便作出明智的決定。 –

+1

在任何情況下,您的建議都與創建*庫*有關。這僅僅是單獨編譯和鏈接與單個翻譯單元的問題。爲什麼標記嵌入?這個問題完全是通用的。 – Clifford

回答

1

這兩個選項適用於不同情況的函數的定義頭文件:

  • 如果你是用C++寫的模板庫,頭,唯一的選擇是好的,因爲你庫沒有鏈接時組件。這是如何分配標準C++庫(以前稱爲STL)的一大部分。
  • 如果您正在編寫C樣式庫或C++類庫,則僅限標題不是選項。您必須從實現中分離一個頭文件,將實現編譯爲可鏈接的庫,並分發與之相關的頭文件。否則,在多個翻譯單元中包含具有相同定義的標題將導致由於重複定義導致的鏈接時錯誤。
0

頭文件只包含定義聲明的原型,包括變量和函數。它可以被許多其他文件包括在內。

函數定義是實現定義的地方,它應該只有一個。

如果將函數定義放在頭文件中並且它被多個C文件包含,編譯器階段會出現多重定義錯誤,特別是在多個對象(包括該函數定義)鏈接到一個最終對象時。

內聯函數有一種情況必須放在頭文件中,因爲它在編譯階段被擴展,並嵌入到調用函數中,所以編譯器必須通過包含該頭文件知道編譯期間的實現。