为什么将标题放在单独的目录中?

Dou*_*ore 19 c c++ directory-structure

我知道在C/C++项目中,将头文件放在一个目录中是很常见的,例如,include在一个单独的目录中实现src.我一直在玩弄不同的项目结构,我想知道是否有任何客观原因,或者仅仅是惯例?

Luc*_*ore 29

约定是其中一个原因 - 大多数时候,通过有效的抽象,你只关心界面,并希望只是看看标题.

这不是唯一的原因.如果您的项目是按模块组织的,那么您很可能必须在不同的模块中包含一些标题,并且您希望清除include目录中的其他"噪声"文件.

此外,如果您计划重新分发模块,则可能需要隐藏实现细节.因此,您只提供标题和二进制文件 - 并且从单个文件夹中分发标题而其他内容则更简单.

还有一个我更喜欢的替代方案 - 公共头文件放在一个单独的文件夹中(这些文件夹包含最小的接口 - 没有任何实现细节可见),私有头文件和实现文件是分开的(可能但不一定在单独的文件夹中) .


use*_*329 7

我更喜欢把它们放在同一个目录中.原因:

接口规范文件和实现该接口的源文件属于项目的同一部分.说你有subsystemx.然后,如果您将subsystemx文件放在subsystemx目录中,subsustemx则是自包含的.

如果有很多包含文件,确保您可以做subsystemx/includesubsystemx/source,但后来我说,如果你把定义class Foofoo.hpp,和foo.cpp你当然想在一同看见他们两个(或至少要做这么容易的可能性)目录列表.查找与之相关的所有文件foo

ls foo*
Run Code Online (Sandbox Code Playgroud)

查找所有实施文件:

ls *.cpp
Run Code Online (Sandbox Code Playgroud)

查找所有声明文件:

ls *.hpp
Run Code Online (Sandbox Code Playgroud)

简单干净.

  • 但是子系统x之外的代码需要使用公共接口 - 因此公共接口头需要简单且可控制地访问.如果您不得不猜测子系统x的哪个标头仅供内部使用,哪些用于外部使用 - 哪个定义了API?私有标头可以与源代码一起生活没问题.但是消费者需要的公共标题 - 需要以更加可控的方式提供. (4认同)
  • @JonathanLeffler我设计的所以没有私有标题."#include"subsystemx/foo.hpp"`总是有意义的.如果有内部细节,我将它们隐藏在实现文件中.另外,您如何确定标题仅供私人使用? (3认同)
  • 你很幸运能够在这样的小型系统上工作. (3认同)
  • @JonathanLeffler 另外,如果您需要私有标题,可以在文件名中添加后缀`_internal`。 (2认同)
  • 我同意这种做法。有一些工具(例如 autotools)可以分发您的项目,安装 make 目标将确定要安装到 PREFIX 中的内容。 (2认同)

Rob*_*ahy 5

它可以保持文件夹结构更清晰.标题和源文件明显不同,并且用于不同的事情,因此将它们分开是有意义的.从这个角度来看,问题基本上与" 为什么源文件和文档进入不同的文件夹 "相同?计算机是你放什么东西在文件夹和你做什么高度无关,文件夹-大部分-只是一个方便的抽象的,因为我们人类解析,专卖店的方式,和召回信息.

还有一个事实,即头文件中还是有益的,你已经建立了即使,也就是说,如果你正在建设一个图书馆,有人想使用该库,他们需要的头文件-而不是源文件-所以它使捆绑这些头文件 - 抓住内容bin和内容,include而不必筛选src- 更容易.