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

时间:2010-05-27 19:00:44

标签: c++ project-management

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

10 个答案:

答案 0 :(得分:45)

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

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

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

  • customer.h

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

  • customer.cpp中
  • customervaliditychecker.h
  • customervaliditychecker.cpp

这样,您的模块的调用者可以立即看到哪些部分是可访问的(公共),哪些部分不可访问。

答案 1 :(得分:7)

将它们分开用于共享库是有意义的,因为它们可以在没有源的情况下以编译形式分发。我已经看到了将“公共”标题(可以从项目或库外部的代码访问的标题)分开的项目,同时将“私有”标题和源文件保留在同一目录中。我认为使用一致的方法是好的,无论你是编写共享库还是应用程序级代码,因为你永远不知道什么时候你可能想把你在应用程序级别编写的东西转换成由多个共享的低级库项目

答案 2 :(得分:7)

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

然而,由于这个原因,标题和来源没有分离。它从来都不是问题。老实说,我觉得这样更好,因为标题和源文件具有共同的位置,你可以获取一个目录,并知道你拥有了使用它所需的一切。它也适用于Subversion的“外部”功能,以及其他VCS中的类似功能。

include / src分离失败的最后一个地方是使用任何代码生成器,例如flex,bison或gengetopts。如果你把事情分散开来,弄清楚这些工具应该把它们的输出放在哪里以便它们构建起来是很棘手的。

答案 3 :(得分:4)

很大程度上取决于所涉项目的规模。最多几十个文件,将它们保存在一个目录中往往更方便。对于包含数百或数千个文件的更大的应用程序,您开始寻找将它们分开的方法(尽管在我所使用的项目中,它在功能行上比src / include更多)。在这些之间,它可能有待商榷。

答案 4 :(得分:2)

我不这样做;它似乎没什么优势。由于标题往往与源文件具有不同的扩展名,因此如果您确实感觉需要,可以让编辑器单独显示它们 - 默认情况下Visual Studio会执行此操作,但我禁用它,因为我更喜欢将它们放在一起

答案 5 :(得分:2)

我几乎总是创建include和src文件夹来分割我的源代码。我认为它使文件夹更简洁,文件更容易在我的IDE中找到。但我认为这只是一个品味问题。

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

答案 6 :(得分:1)

在我看来,两者都没有明显的优势。我最终决定将程序和头文件保存在一起,因为我的编辑器(Visual SlickEdit)在未分离时恰好提供了额外的参考功能。

答案 7 :(得分:1)

我将include(标题)和源文件放在同一目录(文件夹)中。我为不同的主题创建不同的文件夹。在尝试查找头文件时(在调试和研究时),我感到很沮丧。在某些商店中,只有两个文件夹:source和includes。这些目录往往呈指数级增长。重用代码充其量只是一场噩梦。

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

主题组织还为项目增添了一点安全性。由于文件位于不同的目录中,因此减少了对文件的意外损坏(例如删除错误的文件或替换为不同版本)。删除“Person”文件夹中的文件不会影响“Shape”文件夹中的文件。

这只是我的意见,你的里程可能会变化。

答案 8 :(得分:1)

底线:仍在更改的来源和标头位于/src。结晶的代码应该放在/lib& /include(实际上,您可以将所有.lib及其.h保留在/lib中。

  • 将自己的源和标题放在一起,前提是它们(a)特定于此项目或(b)尚未作为共享库进行分解。
  • 将主项目中的某些来源作为(相对稳定的)库分解后,将.a.lib放入/lib,并将其公共接口标题放入{{ 1}}。
  • 所有第三方库及其公共接口标题也会进入/include& /lib

正如其他人所说,工具/ IDE通常更兼容从一个文件夹访问/include / .h。但是从组织的角度来看,将更改的本地代码与稳定的lib代码分开可能很有用。

答案 9 :(得分:0)

我们有一个使用此规则的构建系统。这个构建系统是sconspiracy一组用于配置SCons并专用于C ++世界的脚本。您可以看到使用此工具的示例:fw4spl