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

时间:2010-02-23 21:16:18

标签: c++ architecture

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

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

这类事情有没有标准?

显然,这个问题没有明确的答案。我只是在找一个好的向导。我不想开始学习C ++,花太多时间来担心我的文件是如何布局的。我宁愿拥有一些好的模型,只需要编码。

4 个答案:

答案 0 :(得分:5)

以下是相当典型的......

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文件夹,包含等。每个构建配置的文件夹很常见,并且将obj文件和其他中间文件保存在子文件夹中一个好主意。将子项目文件夹放在obj文件夹中可能很诱人,但通常这是不必要的 - obj文件夹不需要组织良好,所以唯一的问题是文件名冲突,最好的解决方法是拥有唯一的源文件名在(至少)每个项目内。

“include”文件夹IMO只应包含其他项目将包含的标题 - 内部标题属于“src”文件夹。

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

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

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

正如你所说,这不是一个明确的答案 - 当然有微小的变化和完全不同的方法。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

我也学会了制作图书馆。我使用库来包含不会发生太大变化的代码。链接步骤对库的执行速度比目标文件的目录快。

但是,工作场所(a.k.a.商店)可能有不同的样式规则,必须遵守。

答案 3 :(得分:0)

没有必要将头文件和cpp文件放在同一个文件夹中。我做了很多次。您可以拥有不同的文件夹并使用其他文件来获取/包含文件中的两个文件,您将用作包含文件。请访问以下链接,以便更好地了解我所说的内容。它向您展示了如何实现自己的文件组织结构。

http://codednotes.blogspot.com/2014/01/organising-headers-and-source-files.html