8个回答

C++如果都能优先用前向声明,还要include做什么?

闲云
10个点赞 👍

前向声明是必要的技巧,但用前向声明去代替包含头文件,恰恰是不推荐的方式。

参见:

下面是(非官方)中文版中的部分内容。

缺点

  • 前向声明隐藏了依赖关系, 可能会让人忽略头文件变化后必要的重新编译过程.
  • 相比 #include, 前向声明的存在会让自动化工具难以发现定义该符号的模块.
  • 修改库 (library) 时可能破坏前向声明. 函数或模板的前向声明会阻碍头文件的负责人修改 API, 例如拓宽 (widening) 参数类型, 为模版参数添加默认值, 迁移到新的命名空间等等, 而这些操作本是无碍的.
  • std:: 命名空间的符号提供前向声明会产生未定义行为 (undefined behavior).
  • 很难判断什么时候该用前向声明, 什么时候该用 #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); }  // 调用 f(B*)

若用 BD 的前向声明替代 #include, test() 会调用 f(void*) .

  • 为多个符号添加前向声明比直接 #include 更冗长.
  • 为兼容前向声明而设计的代码 (比如用指针成员代替对象成员) 更慢更复杂.

结论:

尽量避免为其他项目定义的实体提供前向声明.

发布于 2024-05-04 12:12・IP 属地上海
吴咏炜
自由评论 (0)
分享
Copyright © 2022 GreatFire.org