假设有一个大项目,有很多类。在每个单独的 header 中添加和删除前向声明很繁琐,但很有必要,因为包含每个 header 会显着减慢编译速度。
将一个库中所有类的列表保存在一个特殊的前向声明列表头中,并将其包含在每个类头文件中,这是一个好主意吗? 据我所知,明显的缺点是:
- 当忘记在另一个类的实现中包含类头时,会出现令人困惑的编译器错误(主要是在 MSVC 上)。
- 由于前向声明列表可能很长,编译时间略有增加
- 添加/删除/重命名类时维护此列表。
最后一个应该是对需要精心维护每个单独的类 header 中的前向声明的情况的改进。
该系统的一个例子是 <iosfwd>
Standard Library header .
这样的系统还有其他缺点吗?
最佳答案
每当添加/删除/重命名类时,都必须修改声明集合。修改将导致几乎整个项目被重建,而不仅仅是依赖于更改的类名的翻译单元(因为所有标题和通过包含,所有翻译单元都包含它[除了那些不依赖于任何类的翻译单元,我预计这种情况很少见])。对于大型项目,这可能意味着增量构建时间从一分钟增加到几个小时。这并不是微不足道的。
一些稳定的类的前向声明的集合,仅包含在依赖于相同(或至少相似)前向声明集的文件中可能有用。
关于c++ - 在库的一个 header 中前向声明所有类是否有任何(非明显的)缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37407504/