繁体   English   中英

如何布局我的 C++ 程序? (我应该把 .h 和 .cpp 文件放在哪里?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM