不是说Google Style Guide就是圣经,但作为一个新手程序员,它似乎是个不错的参考。
Google Style Guide列出了以下前向声明的缺点:
前向声明可能会隐藏依赖性,使用户代码在头文件更改时可以跳过必要的重新编译。
库的后续更改可能会破坏前向声明。函数和模板的前向声明可能会阻止头文件所有者对其API进行本来兼容的更改,例如扩大参数类型、添加具有默认值的模板参数或迁移到新命名空间。
从命名空间std::前向声明符号会导致未定义行为。
很难确定是否需要前向声明或完整的# include。将#include替换为前向声明可能会悄然更改代码的含义:
代码:
// b.h:
struct B {};
struct D : B {};
// good_user.cc:
#include "b.h"
void f(B*);
void f(void*);
void test(D* x) { f(x); } // calls f(B*)
如果将#include替换为B和D的前向声明,test()将调用f(void*)。5. 从头文件中前向声明多个符号可能比简单地#include头文件更冗长。
6. 构造代码以启用前向声明(例如使用指针成员而不是对象成员)可能使代码变得更加复杂且更慢。
然而,在SO上进行一些搜索似乎表明前向声明普遍是更好的解决方案。
因此,考虑到这些看似非微不足道的缺点,能否有人解释这种差异?
何时可以安全地忽略某些或所有这些缺点?
void*
类型参数的函数是一个有问题的函数。 - Richard Hodges