Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在库的一个头中转发声明所有类是否有任何(明显的)缺点?_C++_Forward Declaration - Fatal编程技术网

C++ 在库的一个头中转发声明所有类是否有任何(明显的)缺点?

C++ 在库的一个头中转发声明所有类是否有任何(明显的)缺点?,c++,forward-declaration,C++,Forward Declaration,假设有一个大型项目,有很多类。在每个单独的头中添加和删除前向声明是乏味的,但这是必要的,因为包含每个头会大大降低编译速度 那么,在一个特殊的前向声明列表头中保存一个库中所有类的列表,并将其包含在每个类头文件中,这是一个好主意吗? 我所知道的明显缺点是: 当一个人忘记在另一个类的实现中包含一个类头时,会出现令人困惑的编译器错误(主要是在MSVC上) 由于向前声明的列表可能很长,编译时间略有增加 添加/删除/重命名类时维护此列表 最后一个应该是对每个类头中的前向声明都需要仔细维护的情况的改进。

假设有一个大型项目,有很多类。在每个单独的头中添加和删除前向声明是乏味的,但这是必要的,因为包含每个头会大大降低编译速度

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

  • 当一个人忘记在另一个类的实现中包含一个类头时,会出现令人困惑的编译器错误(主要是在MSVC上)
  • 由于向前声明的列表可能很长,编译时间略有增加
  • 添加/删除/重命名类时维护此列表
最后一个应该是对每个类头中的前向声明都需要仔细维护的情况的改进。 该系统的一个示例是


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

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

一些稳定的类的转发声明集合可能有用,这些类仅由依赖于相同(或至少类似)转发声明集的文件包含