【问题标题】:How do I layout my C++ program? (where should I put the .h and .cpp files?)如何布局我的 C++ 程序? (我应该把 .h 和 .cpp 文件放在哪里?)
【发布时间】:2011-01-20 06:38:57
【问题描述】:

目前,我使用 Java 编程并使用 Maven 相当多。因此,我已经习惯了过去 4 或 5 年使用的命名方案和文件夹结构。

由于我最近开始学习 C++,我意识到我不知道将所有文件放在哪里。我应该按命名空间还是按它所在的层来划分所有内容?例如,我应该在哪里保留一系列专门用于 UI 的文件,而不是用于帮助存储数据的文件?

这类事情有标准吗?

显然,这个问题没有明确的答案。我只是在寻找一个好的指南。我不想通过花太多时间担心我的文件的布局来开始学习 C++。我宁愿有一些好的模型,然后开始编码。

【问题讨论】:

  • 你用的是什么环境?
  • 在哪里放置程序输出是完全不同的事情,最好作为一个单独的问题提出。
  • @gf 好点。编辑了它。

标签: c++ architecture


【解决方案1】:

在小型项目中,我的团队通过链接单元(即库、DLL、EXE)将所有文件组合在一起。如果单元非常大,我们有时会按功能单元或子系统分解文件,这样如果您需要编辑组件,它们通常位于同一位置。

【讨论】:

    【解决方案2】:

    以下是相当典型的...

    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 仅包含将被其他项目#included 的标头 - 内部标头属于“src”文件夹。

    将 UI 内容放在一个单独的文件夹中并不是一个坏主意,如果它足够大的话。我已经看到 UI 的东西是作为一个单独的静态链接的顶级项目完成的,我在这里的意思是特定于应用程序,而不是(例如)wxWidgets。但是,通常情况下,该级别的划分是子项目如果完全值得分开。通常,如何划分子项目更多的是特定于应用程序的块,因此这取决于最好将 UI 内容作为单独的块处理还是作为与特定任务逻辑混合的单独块处理。

    命名空间并不是最常用的语言功能,可能是因为很多人使用“使用”的次数太多,但并没有太大的区别。主库项目的命名空间是有道理的,但是将子文件夹与命名空间 1:1 关联并不是我见过的。我个人有一个包含我的大部分库代码的命名空间,其中有几个子命名空间用于通常很少使用的东西,但在少​​数地方使用了很多(例如“按位”命名空间)。子命名空间仅限于单个源/标头对,因此不需要子文件夹。大多数特定于库的选择都是通过包含正确的标题来完成的 - 除了我通常通过主项目顶级标题包含很多。

    基本上,命名空间是一种避免命名冲突的方法。它们不一定与抽象或功能块或任何东西相关联。在特定项目中,您最好确保名称不冲突。与“std”命名空间一样,可以在一个命名空间中放置 很多 的东西。

    不过,正如您所说,这不是一个确定的答案 - 当然存在细微的变化和完全不同的方法。

    【讨论】:

      【解决方案3】:

      我按主题划分我的项目,一个主题目录:

      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++ 的经验告诉我,headersource 文件应该在同一个目录中。通常,如果头文件与源文件不在同一目录中,则查找头文件会更加困难。

      每个概念一个目录(文件夹)是个好主意。任何复杂或复合的概念都应拆分为多个文件夹或概念。

      我还学会了制作图书馆。我使用库来包含变化不大的代码。库的链接步骤比目标文件的目录执行得更快。

      但是,工作场所(也称为商店)可能有不同的风格规则,必须遵守。

      【讨论】:

        【解决方案4】:

        头文件和 cpp 文件不必放在同一个文件夹中。我已经做过很多次了。您可以将它们放在不同的文件夹中并使用另一个文件来获取/包含文件中的两个文件,您将使用它们作为您的包含。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-17
          • 2016-05-23
          • 1970-01-01
          • 2010-12-01
          • 2018-09-28
          • 2019-10-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多