为应用程序级代码分开“include”和“src”文件夹?

这个问题主要涉及Unix / Linux风格的C ++开发。 我看到许多C ++ 将它们的头文件存储在“包含”文件夹中,源文件存储在“src”文件夹中。 为了一致,我在自己的代码中采用了这个。 但是我不清楚这是否也应该在应用程序代码中完成。 我已经看到了一些使用平面目录结构的情况。 将推荐的方法是什么?

我也将它们分开,但不是严格地在扩展名上,而是在文件的访问上。

假设您有一个pipe理客户信息的模块,并使用两个类来执行此操作:Customer,CustomerValidityChecker。 另外假设应用程序中的其他部分只需要了解Customer类,并且CustomerValidityChecker仅由Customer类用于执行一些检查。 基于这些假设,我存储这样的文件:

公用文件夹(或包含文件夹):

  • customer.h

私人文件夹(或源文件夹):

  • 为customer.cpp
  • customervaliditychecker.h
  • customervaliditychecker.cpp

这样,你的模块的调用者立即清楚哪些部件可以访问(公共),哪些部分不是。

我们有一个自动生成我们的makefile的构build系统。 它所做的一件事是recursion地下降任何子目录,并将它们构build为库,将它们与主目录的对象链接在一起以构build应用程序。 (实际上,这些“子目录”通常是符号链接。)除非目录名以“.so”结尾,否则库是静态的。 有一点很好,就是我们系统的完整版本有很多可执行文件,不需要重复编译公共库。

但是,由于这个原因,没有头和源的分离。 而这从来都不是问题。 老实说,我认为这样更好,因为头文件和源文件具有共同的位置,你可以抓住一个目录,并知道你有一切你需要使用它。 它同样适用于Subversion的“外部”function,以及其他VCS中的类似function。

include / src分离失败的最后一个地方是如果使用任何代码生成器,如flex,bison或gengetopts。 弄清楚这些工具应该把它们的输出放在哪里,这样如果你把东西分散开来的话,它们的构build是非常棘手的。

将它们分开共享库是有意义的,因为它们可以在没有源代码的情况下以编译forms分发。 我已经看到了将“公共”标题(可以从项目或库之外的代码访问的标题)分离出来的项目,同时将“私有”标题和源文件保留在同一个目录中。 我认为无论您是编写共享库还是应用程序级代码,都使用一致的方法是很好的,因为您永远不知道何时将您在应用程序级写入的内容转换为由多个项目。

很大程度上取决于涉及的项目的规模。 多达几十个文件,将它们保存在一个目录中往往更方便。 对于包含数百或数千个文件的更大的应用程序,您可以开始寻找将它们分开的方法(尽pipe在我所开发的项目中,function上比src / include要多)。 在这两者之间,这可能是值得商榷的。

我不这样做; 这似乎没有什么优势。 由于标题往往与源文件有不同的扩展名,如果你真的觉得需要的话,你可以让你的编辑器单独显示它们 – Visual Studio默认是这样做的,但我禁用它,因为我更喜欢把它们看在一起

我几乎总是创build包括和src文件夹来拆分我的源代码。 我认为这使得文件夹不那么混乱,在我的IDE中更容易find文件。 但我认为这只是一个品味问题。

这两种方法都是有效的。 这取决于你想要遵循的编码风格。

在我看来,没有明显的优势。 我终于决定把程序和头文件放在一起,因为我的编辑器(Visual SlickEdit)碰巧在不分离时提供额外的引用特性。

我把include(header)和源文件放在同一个目录(文件夹)中。 我为不同的主题创build不同的文件夹。 当试图查找头文件(在debugging时也用于研究)时,我感到沮丧。 在一些商店,只有两个文件夹:来源和包括。 这些目录往往成倍增长。 重用代码充其量只是一场噩梦。

恕我直言,我相信按主题组织是更好的。 每个主题文件夹应至less构build到一个库中。 不同的项目可以通过search或包含文件夹轻松包含主题。 这些项目只需要包含这些库。 智能构build引擎可以将主题文件夹列为依赖关系。 这加快了构build过程。

主题组织也为项目增添了一点安全感。 由于文件位于不同的目录中,文件的意外损坏(例如,删除错误的文件或replace为不同的版本)被减less了。 删除“Person”文件夹中的文件不会影响“Shape”文件夹中的文件。

这只是我的看法,您的里程可能会有所不同。

底线 :仍在变化的来源和标题进入/src 。 已经结晶的代码应该放在/lib/include (实际上你可以将所有.lib和它们的.h放在/lib )。

  • 保留自己的来源和标题,只要它们是(a)特定于这个项目或(b)还没有被分解为共享库。
  • 一旦主项目中的某些源代码已经作为(相对稳定的)库被分解出来,将.a.lib放入/lib ,并将其公用接口头放入/include
  • 所有第三方库和它们的公共接口头文件也进入/lib/include

正如其他人所指出的,工具/ IDE从一个文件夹访问.h / .c通常更兼容。 但是从组织的angular度来看,将稳定的lib代码与不断变化的本地代码分开是有用的。

我们有一个使用这个规则的构build系统。 这个构build系统是一套脚本来configurationSCons并专门用于C ++世界。 你可以看到一个使用这个工具的例子: fw4spl