c++ - 在库的一个 header 中前向声明所有类是否有任何(非明显的)缺点?

标签 c++ forward-declaration

假设有一个大项目,有很多类。在每个单独的 header 中添加和删除前向声明很繁琐,但很有必要,因为包含每个 header 会显着减慢编译速度。

将一个库中所有类的列表保存在一个特殊的前向声明列表头中,并将其包含在每个类头文件中,这是一个好主意吗? 据我所知,明显的缺点是:

  • 当忘记在另一个类的实现中包含类头时,会出现令人困惑的编译器错误(主要是在 MSVC 上)。
  • 由于前向声明列表可能很长,编译时间略有增加
  • 添加/删除/重命名类时维护此列表。

最后一个应该是对需要精心维护每个单独的类 header 中的前向声明的情况的改进。 该系统的一个例子是 <iosfwd> Standard Library header .

这样的系统还有其他缺点吗?

最佳答案

每当添加/删除/重命名类时,都必须修改声明集合。修改将导致几乎整个项目被重建,而不仅仅是依赖于更改的类名的翻译单元(因为所有标题和通过包含,所有翻译单元都包含它[除了那些不依赖于任何类的翻译单元,我预计这种情况很少见])。对于大型项目,这可能意味着增量构建时间从一分钟增加到几个小时。这并不是微不足道的。

一些稳定的类的前向声明的集合,仅包含在依赖于相同(或至少相似)前向声明集的文件中可能有用。

关于c++ - 在库的一个 header 中前向声明所有类是否有任何(非明显的)缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407504/

相关文章:

python - 如何在 Ubuntu 16.04 的 Anaconda 环境中将 OpenCV C++ 代码与 python 代码集成?

c++ - 一个 QThread 对象中的槽函数可以并发运行吗?

objective-c - Objective-C 接口(interface)的前向声明

c++ - 尝试与 Base 中的 Derived 函数成为 friend - 为什么它不起作用?

c++ - 如何在不在 .h 文件中制作原型(prototype)的情况下将 Objective-C++ 类公开给 swift

c++ - 用原始类型替换模板类

C++ OpenCV mat.at 在使用数据时出现访问冲突

C++:带有删除器的类的前向声明,用于可重复的唯一指针

c++ - 不能将 std::unique_ptr<T> 与 T 一起使用为前向声明

c++ - 包含后是否需要前向声明?