forward-declaring all 类 in one header 对于一个图书馆有什么(other-than-obvious)缺点吗?
Are there any (other-than-obvious) drawbacks to forward-declaring all classes in one header for a library?
假设有一个大型项目,有很多 classes。在每个单独的 header 中添加和删除前向声明是乏味的,但这是必要的,因为包含每个 header 会显着减慢编译速度。
那么在一个特殊的前向声明列表 header 中保留一个库中所有 classes 的列表并将其包含在每个 class header 文件?
我知道的明显缺点是:
- 当一个人忘记在另一个 class 的实现中包含 class header 时,会出现令人困惑的编译器错误(主要是在 MSVC 上)。
- 由于前向声明的列表可能很长,编译时间略有增加
- 当 class 为 added/removed/renamed 时维护此列表。
最后一个应该是对每个人 class header 的前向声明需要精心维护的情况的改进。
该系统的一个示例是例如<iosfwd>
Standard Library header.
这样的系统还有其他缺点吗?
当 class 为 added/removed/renamed 时,必须修改声明的 collection。修改将导致几乎整个项目被重建,而不仅仅是依赖于更改后的 class 名称的翻译单元(因为所有 headers 并且通过包含,所有翻译单元都包含它 [除了那些不要依赖于任何 class,我希望这种情况很少见])。对于大型项目,这可能意味着增量构建时间从一分钟增加到几小时。这几乎是微不足道的。
一些 class 的
前向声明稳定,仅包含通过依赖于相同(或至少相似)一组前向声明的文件可能会有用。
假设有一个大型项目,有很多 classes。在每个单独的 header 中添加和删除前向声明是乏味的,但这是必要的,因为包含每个 header 会显着减慢编译速度。
那么在一个特殊的前向声明列表 header 中保留一个库中所有 classes 的列表并将其包含在每个 class header 文件? 我知道的明显缺点是:
- 当一个人忘记在另一个 class 的实现中包含 class header 时,会出现令人困惑的编译器错误(主要是在 MSVC 上)。
- 由于前向声明的列表可能很长,编译时间略有增加
- 当 class 为 added/removed/renamed 时维护此列表。
最后一个应该是对每个人 class header 的前向声明需要精心维护的情况的改进。
该系统的一个示例是例如<iosfwd>
Standard Library header.
这样的系统还有其他缺点吗?
当 class 为 added/removed/renamed 时,必须修改声明的 collection。修改将导致几乎整个项目被重建,而不仅仅是依赖于更改后的 class 名称的翻译单元(因为所有 headers 并且通过包含,所有翻译单元都包含它 [除了那些不要依赖于任何 class,我希望这种情况很少见])。对于大型项目,这可能意味着增量构建时间从一分钟增加到几小时。这几乎是微不足道的。
一些 class 的
前向声明稳定,仅包含通过依赖于相同(或至少相似)一组前向声明的文件可能会有用。