[英]Best practice in C++ - when should I divide my project into .h and .cpp files?
[英]How do I layout my C++ program? (where should I put the .h and .cpp files?)
目前,我用 Java 編程並經常使用 Maven。 因此,我已經習慣了我在過去 4 或 5 年中使用的命名方案和文件夾結構。
由於我最近開始學習 C++,我意識到我不知道將所有文件放在哪里。 我應該按命名空間還是按它所在的層級來划分所有內容? 例如,我應該在哪里保存一系列專門用於 UI 的文件,與用於幫助存儲數據的文件相關聯?
這種事情有標准嗎?
顯然,這個問題沒有明確的答案。 我只是在尋找一個好的指南。 我不想通過花太多時間擔心我的文件的布局來開始學習 C++。 我寧願有一些好的模型,然后開始編碼。
以下是相當典型的...
third-party library
release
obj
debug
obj
include
src
sublib 1
sublib 2
mylibrary
release
obj
debug
obj
include
src
sublib 1
sublib 2
myapp
release
obj
debug
obj
subapp 1
subapp 2
mylittleapp
release
obj
debug
obj
基本上,子項目的子文件夾對於較大的項目是常見的,但大多數特定項目都有 src、include 等文件夾。每個構建配置的文件夾是常見的,將 obj 文件和其他中間文件保存在該子文件夾中是個好主意. 將子項目文件夾放在 obj 文件夾中可能很誘人,但通常這是不必要的 - obj 文件夾不需要很好地組織,所以唯一的問題是文件名沖突,最好的解決方法是擁有唯一的源文件名在(至少)每個項目中。
“include”文件夾應該 IMO 只包含將由其他項目#include 的頭文件 - 內部頭文件屬於“src”文件夾。
將 UI 內容放在一個單獨的文件夾中並不是一個壞主意,如果它足夠大的話。 我已經看到 UI 的東西是作為一個單獨的靜態鏈接的頂級項目完成的,我在這里的意思是特定於應用程序,而不是(例如)wxWidgets。 但是,通常情況下,如果完全值得分離,那么該級別的划分就是子項目。 如何划分子項目通常更多地取決於特定於應用程序的塊,因此這取決於 UI 內容是最好作為單獨的塊處理還是作為與特定於任務的邏輯混合的單獨塊處理。
命名空間不是最常用的語言特性,可能是因為很多人使用“使用”太多了,它們沒有太大區別。 主庫項目的命名空間是有意義的,但將子文件夾與命名空間 1:1 關聯並不是我見過的。 我個人有一個命名空間,其中包含我的大部分庫代碼,其中有幾個子命名空間用於一般很少使用的東西,但在一些地方使用很多(例如“按位”命名空間)。 子命名空間僅限於單個源/標頭對,因此不需要子文件夾。 大多數特定於庫的選擇是通過包含正確的標題來完成的 - 除了我通常通過主項目頂級標題包含很多。
基本上,命名空間是一種避免命名沖突的方法。 它們不一定與抽象或功能塊或任何東西相關聯。 在特定項目中,您最好確保名稱不沖突。 與“std”命名空間一樣,可以將很多東西放在一個命名空間中。
但是,正如您所說,這不是一個明確的答案 - 當然有細微的變化和完全不同的方法。
在小型項目中,我的團隊通過鏈接單元(即庫、DLL、EXE)將所有文件組合在一起。 如果單元非常大,我們有時會按功能單元或子系統拆分文件,這樣如果您需要編輯組件,它們通常位於同一位置。
我按主題分解我的項目,一個主題目錄:
menu_planner
src
recipes
debug -- contains debug object files and libraries
release -- contains release object files and libraries
obsolete -- contains obsolete source files
ingredients
debug -- contains debug object files and libraries
release -- contains release object files and libraries
obsolete -- contains obsolete source files
references
debug -- contains debug object files and libraries
release -- contains release object files and libraries
obsolete -- contains obsolete source files
meals
debug -- contains debug object files and libraries
release -- contains release object files and libraries
obsolete -- contains obsolete source files
menus
debug -- contains debug object files and libraries
release -- contains release object files and libraries
obsolete -- contains obsolete source files
docs
designs
我使用 C 和 C++ 的經驗告訴我,頭文件和源文件應該在同一目錄中。 通常,當頭文件與源文件不在同一目錄中時,查找頭文件會更加困難。
每個概念一個目錄(文件夾)是個好主意。 任何復雜或復合的概念都應拆分為多個文件夾或概念。
我還學會了制作圖書館。 我使用庫來包含變化不大的代碼。 與目標文件的目錄相比,鏈接步驟對庫的執行速度更快。
但是,工作場所(又名商店)可能具有必須遵循的不同風格規則。
不必將頭文件和 cpp 文件放在同一文件夾中。 我已經這樣做了很多次。 您可以將 放在不同的文件夾中並使用另一個文件來獲取/包含文件中的兩個文件,您將使用它們作為您的包含。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.