使用一个大包含文件的优点/缺点

时间:2013-01-02 09:11:48

标签: c++ include header-files

我有一个个人项目,我怀疑它会超过20对header / cpp文件。我想知道让每个头文件和cpp文件包含它需要的其他文件(或使用前向声明)是否更好,或者让每个文件都包含“Includes.hpp”,后者又包括所有标准库,给出每个类的前向声明,然后包括我的所有其他标题。

我可以看到,使用一个大头文件:

  • 清理一切
  • 使从其他目录中包含这些文件变得更容易(因为您只需导航以使用一个文件,然后链接所有其他文件)
  • 将包含每个编译的所有文件,考虑到这是一个小项目,不是缺点,因为我将使用所有文件

这是个好主意吗?

3 个答案:

答案 0 :(得分:5)

我会说一般这是一个坏主意,原因如下:

  • 它给你很差的封装:客户端应该只需要拉入他们需要的头文件。通过这种方法,包含将引入所有内容,正如Alok所提到的将增加构建时间和重建的敏感性
  • 接口类和实现类之间没有区别,即库的客户端使用的那些以及客户端不需要(也可能不应该)看到此库内部使用的那些
  • 如果您的任何标头定义了宏,那么这些可能会“泄漏”到包含标头的任何其他代码中,这可能是不合需要的。任何曾经输入#undef MIN的人都会知道这种痛苦。
  • 如果你有几个需要彼此了解的类,那么就有可能进行递归包含,所以它可能对包含的顺序很敏感,或者你会得到包含周期

我认为虽然有一个实例可以接受,但是如果你的库只提供了一些打算由客户端调用的类/函数,那么其余只是实现所使用的内部类。所以客户可以只包括mylib.h,这就是他们需要担心的全部内容。如果您想将库编译为静态库,这也可以更容易,因为您可以只分发库和一个标题。

答案 1 :(得分:3)

说实话,我不会这样做。您提到您的项目将只有大约20个cpp文件,但您没有提到这些文件有多大以及它们将包含多么复杂的代码。如果你把所有东西都放在一个大的头文件中,每次你必须重新编译这20个文件,如果这些文件包含很多代码,这将使编译时间显着增加。

当然,如果要包含在大标题中的所有标题库中的标题或标题库都不会修改,那么您可以将它们全部放在预编译的标题中,并让所有cpp文件都包含它。

但是,如果您要修改标题(例如更改类定义,添加typedef等),您应该知道每次修改都需要重新编译所有cpp文件。根据这些文件的大小,每个小编辑(更改函数名称,添加空格,添加注释)可能会延迟您的工作一分钟,这可能需要五秒钟(如果您使用更复杂的库,如Boost.Spirit,那些时间真的很快)。

总而言之,如果您正在处理需要维护的项目,我不会将所有内容都放在一个文件中,即使项目很小现在

答案 2 :(得分:0)

不是。

使用便利标题确实存在,介意,它们可以用于打包在一起的功能,并且还可以优先选择include到前向声明头文件,如果您认为标题的客户端90%的时间也需要包含对象的完整定义。

然而,全局标题是糟糕的风格,虽然你的项目现在很小,但它可能会在以后增长。不得不解开这种事情并重新点头,我只能说:没有乐趣......

无论如何还有什么好处?如果项目很小,那么开头的标题很少,所以它很少。