1

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

如我所见,使用一个大头文件:

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

这是一个好主意吗?

4

3 回答 3

5

我会说,总的来说,这是一个坏主意,原因有以下几个:

  • 它给你的封装很差:客户端应该只拉入他们需要的标题。通过这种方法,包含将引入所有内容,正如 Alok 提到的那样,这将增加构建时间和对重建的敏感性
  • 接口类和实现类之间没有区别,即你的库的客户端使用的那些和这个库内部使用的那些客户端不需要(也许不应该)看到的
  • 如果您的任何标头定义了宏,那么这些现在可能会“泄漏”到包含标头的任何其他代码中,这可能是不可取的。任何不得不打字的人#undef MIN都会知道这种痛苦。
  • 如果您有多个需要相互了解的类,则可能会递归包含,因此它可能对包含顺序很敏感,否则您将获得包含循环

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

于 2013-01-02T09:56:41.960 回答
3

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

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

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

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

于 2013-01-02T09:40:19.990 回答
0

并不真地。

确实存在便利标头的使用,请注意,它们可用于打包组合在一起的功能,include如果您认为 90% 的时间是无论如何,标头也需要包含对象的完整定义。

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

无论如何,收益是什么?如果项目很小,开始的标题很少,所以它是边缘的。

于 2013-01-02T09:37:32.353 回答