使用一个大的包含文件的优点/缺点
Posted
技术标签:
【中文标题】使用一个大的包含文件的优点/缺点【英文标题】:Pros/ Cons of using one big include file 【发布时间】:2013-01-02 09:11:47 【问题描述】:我有一个个人项目,我怀疑它会超过 20 对 header/cpp 文件。我想知道是否最好让每个头文件和 cpp 文件包含它需要的其他文件(或使用前向声明),或者让每个文件都包含“Includes.hpp”,而后者又包含所有标准库,给出每个类的前向声明,然后包括我所有的其他标题。
如我所见,使用一个大头文件:
清理一切 更容易从其他目录中包含这些文件(因为您只需导航到使用一个文件,然后链接所有其他文件) 将包含每次编译的所有文件,考虑到这是一个小项目,这不是缺点,因为我将使用所有文件这是个好主意吗?
【问题讨论】:
一方面,它可以增加构建时间。每次修改哪怕是一件小事,所有的源文件都需要编译。 【参考方案1】:我会说总的来说这是一个坏主意,原因有几个:
它给您带来了糟糕的封装:客户端应该只拉入他们需要的标头。通过这种方法,包含将引入所有内容,正如 Alok 提到的那样,这将增加构建时间和对重建的敏感性 接口类和实现类之间没有区别,即您的库的客户使用的类和该库内部使用的客户不需要(也许不应该)看到的类 如果您的任何标头定义了宏,那么这些宏现在可能会“泄漏”到包含标头的任何其他代码中,这可能是不可取的。任何不得不输入#undef MIN
的人都会知道这种痛苦。
如果您有多个需要相互了解的类,则可能会出现递归包含,因此它可能对包含顺序很敏感,否则您将获得包含循环
我认为尽管有一个实例是可以接受的,那就是如果您的库仅提供了一些旨在由客户端调用的类/函数,而其余的只是实现使用的内部类。所以客户可以只包括mylib.h
,这就是他们需要担心的全部。如果您想将库编译为静态库,这也使您更容易,因为您只需分发库和一个标头即可。
【讨论】:
【参考方案2】:说实话,我不会这样做。您提到您的项目将只有大约 20 个 cpp 文件,但您没有提及这些文件将有多大以及它们将包含多么复杂的代码。如果你把所有东西都放在一个大头文件中,那么每次你都必须重新编译这 20 个文件,如果这些文件包含大量代码,那将大大增加编译时间。
当然,如果你想在大头文件中包含的只是来自标准库的头文件或你不会修改的头文件,那么你可以将它们全部放在一个预编译的头文件中,让你所有的 cpp 文件都包含它.
但是,如果您要修改头文件(例如更改类定义、添加 typedef 等),您应该知道每次修改都需要重新编译所有 cpp 文件。根据这些文件的大小,每个小的编辑(更改函数名称、添加空格、添加注释)可能会延迟您的工作一分钟,而这可能需要五秒钟(如果您使用更复杂的库,例如Boost.Spirit,那些时间真的很快)。
总而言之,如果您正在处理一个需要维护的项目,我不会将所有内容都放在一个文件中,即使该项目很小现在。
【讨论】:
【参考方案3】:不是真的。
确实存在 方便 标头的使用,请注意,它们可用于打包组合在一起的功能,也可以更喜欢 include
而不是头文件中的前向声明如果您认为 90% 的时间标头的客户端也将需要包含对象的完整定义。
但是,全局标头是一种不好的风格,虽然您的项目现在很小,但它可能会在以后增长。不得不解开这种事情并重新划分标题,我只能说:没有乐趣......
还有什么好处呢?如果项目很小,开始的标题很少,所以它是边缘的。
【讨论】:
以上是关于使用一个大的包含文件的优点/缺点的主要内容,如果未能解决你的问题,请参考以下文章