并不是说 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 的前向decls,test() 将调用f(void*)。
从标头前向声明多个符号可能比简单地#includeing 标头更冗长。
构造代码以启用前向声明(例如,使用指针成员而不是对象成员)会使代码变得更慢和更复杂。
但是,对 SO 的一些搜索似乎表明前向声明通常是一个更好的解决方案。
因此,鉴于这些看似微不足道的缺点,有人可以解释这种差异吗?
什么时候可以安全地忽略部分或全部这些缺点?