2009-05-20 73 views

回答

15

一般來說,你希望編譯器內聯,或模板代碼的東西。無論哪種情況,代碼在編譯器的任何地方都必須可用,所以你別無選擇。

但是,請注意,您放在一個頭文件中的代碼越多,編譯所需的時間越長 - 並且更多的時候您最終會碰到頭文件,從而導致緩慢構建的連鎖反應:)

0

這取決於你。 Boost幾乎將所有的代碼放在標題中......而且它們是一個備受尊敬的庫。

+4

Boost也是模板和模板元編程的重要用戶 - 這意味着必須在模板實例化站點上提供大量代碼。所以他們在這裏有一些特殊情況...... – bdonlan 2009-05-20 05:42:27

5

的一個原因,以儘量減少在報頭的代碼量是最小化的代碼量被重新編譯的執行變化時。如果你不關心,你可以在頭文件中有任何數量的代碼。

有時僅在頭文件中使用代碼是爲了公開代碼 - ATL爲eaxmple做這些事情。

1

我要堅持在.c和.cpp文件和頭的東西,在.H,.HPP文件的代碼。原因是,當我下載源碼的.tar.gz或zip文件時,我一直在尋找頭文件的.h文件和源文件的.cpp文件。很多人習慣於這樣,所以我認爲你應該保持這種風格。

1

當您在簡單的getter/setter方法的頭文件中有代碼時,它或多或少就好,因爲您要麼因爲代碼維護(在頭文件和實現文件中鍵入相同的方法)而節省一些工作時間,要麼因爲您實際上希望該方法由於時間關鍵位置的函數調用開銷而內聯。

如果你有很多可見或多或少的類,你不僅會受到較慢的構建,鏈接時間可能是巨大的

頭文件和實現文件之間的混合代碼的另一個缺點是可讀性。如果你在頭文件中一致地聲明並且一致地將代碼保存在實現文件中,那麼在這些方法之間保持相同的順序更容易。如果你知道我的意思,那就沒有漏洞。

乾杯!

1

另請注意,如果將代碼放在頭文件中,並且不小心使用Makefile,則可能會產生一些奇怪的副作用。我曾經有過一個錯誤,這是因爲我在一個頭文件中更改了代碼,而這個頭文件被重新編譯爲某些文件,但是沒有其他文件,因爲Makefile中的依賴關係不正確。如果您自動生成Makefile,這不是什麼大問題。

5

當開發一個大型的C++項目時,你需要警惕地使每個.CPP文件與儘可能少的頭文件相匹配。

所以,我對於「畫線」一個簡單的規則:

如果通過內聯實現,你的頭文件,現在需要有一個額外的頭文件,你應該將實施走出頭和到.CPP文件中。

當然,這不是不內聯的唯一原因,但這是一個不應該交叉的明確示例。

1

如果您希望「內聯」代碼,您需要在代碼頭中添加代碼。否則,在實體中堅持實現有更多優勢。

4
  1. 內聯函數
  2. 一個/兩個線路的方法
  3. 模板

但是,當報頭尺寸增大,這將需要越來越多的時間來編譯,所以它是使用有用預編譯頭文件。

相關問題