我對學習C++很感興趣,對於多頭文件的用途我很好奇。爲什麼你不能在一個頭文件中包含所有東西?爲什麼你使用多個頭文件?
回答
是的,你可以擁有一個頭文件。然而,隨着項目的增長,這個頭文件很快就會變成一個難以維護且速度慢的混亂。
你可以擁有在一個頭文件中的一切。你甚至可以將你的整個程序放在一個文件中。
把事情分成不同的小文件的好處是你一次編譯小部分,你只需要重新編譯組件已經改變的那些部分。您還可以將通用代碼放入單獨的文件中,並使用單獨項目中的這些文件,而無需在項目中複製粘貼代碼。所以如果你發現一個bug,你可以修復一次,所有的項目都能從修復中受益。
爲什麼你不能只在一個頭文件中包含所有東西?
如果您將所有內容都塞進單個標頭,那麼對該標頭的每一次更改都將導致包含該標頭的每個文件的重新編譯。在你的情況下,這將是整個項目。
當您有很多小文件並且只有在絕對必要時才包含它們,管理項目會更容易。
關鍵字這裏是模塊化:
模塊化是可被分離並重新組合的系統的部件的程度。
正如其他人已經提到的那樣,您可以在單個文件中編寫程序。而且,你可以把它寫在一行中。但是,你不這樣做,因爲單獨的和重新組合這個程序的一部分,如果它不編譯就更不用說調試了。
標題存在組織。
對於一個非常簡單的項目,一個頭文件可以做得很好。你甚至可以根本不使用頭文件,只需將所有內容寫入單個文件。
但是,一旦你成長爲一個更大的項目,其中包含並行系統,在多個上下文中使用的類或僅使用第三方庫(如OpenSSL或MySQL),您不能簡單地期望將所有代碼放入具有數百萬行代碼的單個文件。
您可能還想知道爲什麼不在您的項目中將所有和任何必需的標題放在一個「common.h」中,然後在每個.cpp
中輸入#include
。
答案是,因爲每個.cpp
單獨編譯,所以,如果你限制了頭部的每個.cpp
只需要什麼的話,你會同時降低所產生的.obj
大小和編譯時間。
此外,每次更改任何標題時,您都將被迫重新編譯整個項目,而不是僅重新編譯涉及的.cpp
。
除了已經發布的所有答案,你可能要考慮的是C++有哲學你付出你用什麼或者相反,你不支付你不使用 。
如果我的應用需求,說,複數,然後我繼續前進,#include
此功能。如果我不需要它,那麼爲什麼我的代碼甚至應該意識到這樣的概念存在,沒有任何理由。
當我確定我保持一遍又一遍,包括相同的頭文件對於給定類型的應用程序,我創建一個主頭文件,其包括包括,我只是#include
那一個。
例如:
// @file project.hpp
// @brief provides all the functionality required by `project`
#include<library1.hpp>
#include<library2.hpp>
#include<library3.hpp>
// any type definitions go below this line
,然後,在我的項目
如boost
// @file project.cpp
// @brief Implements `project`
#include<project.hpp>
// go ahead and implement project
其他庫通常提供一個「主」包括文件,例如使用如上所述的簡化一個圖書館。
- 1. 你使用什麼文件格式爲你的應用程序,爲什麼?
- 2. 爲什麼使用_PROTOTYPE頭文件
- 3. 爲什麼包含一個POSIX函數的多個頭文件?
- 4. 除了頭文件你需要什麼來使用頭中定義的函數
- 5. 你爲什麼使用T4?
- 6. 你使用什麼文件夾結構
- 7. 爲什麼你不應該使用svg文件作爲網站?
- 8. 爲什麼你或你不使用多邊形解決方案?
- 9. 爲什麼你需要使用多個構造函數?
- 10. 什麼是.htaccess文件。爲什麼我們使用這個文件。使用這個文件有什麼好處?
- 11. 你使用什麼變量名作爲文件描述符?
- 12. 爲什麼一個單鏈表有多個頭是件好事?
- 13. 在wordpress中使用多個頭文件
- 14. 爲什麼pywhois返回空頭文件?
- 15. 爲什麼Photoshop文件以8BPS開頭?
- 16. 爲什麼包含標準頭文件?
- 17. 爲什麼java中沒有頭文件?
- 18. 爲什麼關閉curl頭文件?
- 19. 爲什麼我不能使用外部頭文件?
- 20. 爲什麼c頭文件不是使用ANTLR生成的1.5?
- 21. 爲什麼在WAV文件頭中使用小端和大端?
- 22. 爲什麼在C++頭文件中使用#ifndef和#define?
- 23. 什麼固件文件格式使用頭文件「Intel_FBF」
- 24. 這個頭文件有什麼問題?
- 25. 你爲什麼要複製一個文件描述符並從不使用它?
- 26. 爲什麼你會使用string.toString()?
- 27. 爲什麼你可以使用方法
- 28. 爲什麼你停止使用JSF?
- 29. 你爲什麼要使用umask?
- 30. 什麼是BasicHttpRequest頭文件
目前尚不清楚「一切」是什麼意思。 –
出於同樣的原因,您不會將所有文件放在桌面上,或將所有電子郵件保留在收件箱 - 組織中。 –