回答
一般來說,你希望編譯器內聯,或模板代碼的東西。無論哪種情況,代碼在編譯器的任何地方都必須可用,所以你別無選擇。
但是,請注意,您放在一個頭文件中的代碼越多,編譯所需的時間越長 - 並且更多的時候您最終會碰到頭文件,從而導致緩慢構建的連鎖反應:)
這取決於你。 Boost幾乎將所有的代碼放在標題中......而且它們是一個備受尊敬的庫。
的一個原因,以儘量減少在報頭的代碼量是最小化的代碼量被重新編譯的執行變化時。如果你不關心,你可以在頭文件中有任何數量的代碼。
有時僅在頭文件中使用代碼是爲了公開代碼 - ATL爲eaxmple做這些事情。
我要堅持在.c和.cpp文件和頭的東西,在.H,.HPP文件的代碼。原因是,當我下載源碼的.tar.gz或zip文件時,我一直在尋找頭文件的.h文件和源文件的.cpp文件。很多人習慣於這樣,所以我認爲你應該保持這種風格。
當您在簡單的getter/setter方法的頭文件中有代碼時,它或多或少就好,因爲您要麼因爲代碼維護(在頭文件和實現文件中鍵入相同的方法)而節省一些工作時間,要麼因爲您實際上希望該方法由於時間關鍵位置的函數調用開銷而內聯。
如果你有很多可見或多或少的類,你不僅會受到較慢的構建,鏈接時間可能是巨大的。
頭文件和實現文件之間的混合代碼的另一個缺點是可讀性。如果你在頭文件中一致地聲明並且一致地將代碼保存在實現文件中,那麼在這些方法之間保持相同的順序更容易。如果你知道我的意思,那就沒有漏洞。
乾杯!
另請注意,如果將代碼放在頭文件中,並且不小心使用Makefile,則可能會產生一些奇怪的副作用。我曾經有過一個錯誤,這是因爲我在一個頭文件中更改了代碼,而這個頭文件被重新編譯爲某些文件,但是沒有其他文件,因爲Makefile中的依賴關係不正確。如果您自動生成Makefile,這不是什麼大問題。
當開發一個大型的C++項目時,你需要警惕地使每個.CPP文件與儘可能少的頭文件相匹配。
所以,我對於「畫線」一個簡單的規則:
如果通過內聯實現,你的頭文件,現在需要有一個額外的頭文件,你應該將實施走出頭和到.CPP文件中。
當然,這不是不內聯的唯一原因,但這是一個不應該交叉的明確示例。
如果您希望「內聯」代碼,您需要在代碼頭中添加代碼。否則,在實體中堅持實現有更多優勢。
- 內聯函數
- 一個/兩個線路的方法
- 模板
但是,當報頭尺寸增大,這將需要越來越多的時間來編譯,所以它是使用有用預編譯頭文件。
- 1. 在Ruby代碼中沒有評論可以接受嗎?
- 2. 頭文件可以與main中的代碼配合嗎?
- 3. 我可以在PHP代碼中包含C文件嗎?
- 4. 我可以在CUDA代碼的內核部分使用C++頭文件嗎?
- 5. 傳遞密碼可以接受嗎?
- 6. Tomcat可以接受沒有Host頭的HTTP 1.1請求嗎?
- 7. 我可以有兩個組頭文件嗎?我可以替代打印嗎?
- 8. C;頭文件和代碼
- 9. CSS代碼/文件可以加載JS代碼/文件嗎?
- 10. 用Range響應代碼回覆Range請求可以接受嗎?
- 11. C#如何在代碼中編寫xml文件,以便xna接受加載它?
- 12. QAction可以接受滴嗎?
- 13. 你可以把#includes放在C++頭文件中嗎?
- 14. NSDockTile可以接受鼠標事件嗎?
- 15. 混合C/C++頭文件可以包含另一個混合頭文件嗎?
- 16. C++編譯的DLL可以在代碼中有區別嗎?
- 17. 可以在ini文件中連接嗎?
- 18. 你可以在UWP中的C#代碼中使用C++ DLL嗎?
- 19. C可以運行編譯的Python代碼(.pyc文件)嗎?
- 20. 複製文件的C#代碼,可以改進此片段嗎?
- 21. 在java中有可以接受未來任務的庫嗎?
- 22. 在HTML中有多餘的語言屬性可以接受嗎?
- 23. 在哪裏可以在線查找C++庫頭文件的源代碼?
- 24. DW可以接受左連接嗎?
- 25. ActiveMQ可以接受來自Camel的Enum標頭的消息嗎?
- 26. 以下模式可以接受嗎?
- 27. 我可以在.js文件中寫入ASP代碼嗎?
- 28. 我可以在.htacces文件中寫入php代碼嗎?
- 29. Drupal 7 - 可以在模板文件中編寫php代碼嗎?
- 30. 客戶端可以在html文件中找到php代碼嗎?
Boost也是模板和模板元編程的重要用戶 - 這意味着必須在模板實例化站點上提供大量代碼。所以他們在這裏有一些特殊情況...... – bdonlan 2009-05-20 05:42:27