先说结论:尽可能避免前置声明,使用#include
包含对应的头文件。
定义
- 前置声明是类、函数和模板的纯粹声明,不包含其定义。
- 前置声明是为了降低复杂的依赖关系,防止一个头文件修改引起重新编译时的多米诺效应。
优点
使用前置声明的优点其实就是使用#include
的缺点
- 在编译时,更多的
#include
会展开更多的头文件,处理更多的输入,加长编译时间。 - 在重新编译时,
#include
会将头文件中的无关修改重新一起编译,同样会加长编译时间。
缺点
- 前置声明隐藏了依赖关系,在头文件有修改时会跳过必要的重新编译过程。
- 函数、模板的前置声明会妨碍API变动,必须头文件和前置声明一起修改。
- 当前置声明来自命名空间
std::
时,这种行为未定义。 - 仅仅为了前置声明而重构代码(指针成员代替对象成员),可能会使代码变得更复杂。
结论
- 尽量避免前置声明在其他项目中定义的实体。
- 对于函数总是使用
#include
。 - 对于类模板,优先使用
#include
。