包含防护做保护头文件免受相互递归包含。
当相互包含的标头中的数据结构定义之间存在依赖关系时,就会出现问题。例如:
// a.h #include "b.h" struct A { ... }; // b.h #include "a.h" struct B { A* pA; // error: class A is forward-declared but not defined };
要解决此问题,应使用前向声明而不是包含防护:
// b.h #include "a.h" // Forward declaration of A struct A; struct B { A* pA; };
包含防护做保护标头免受同一翻译单元中的冗余包含。然而,由于存在于不同的翻译单元中,多个定义仍然可能出现。
要解决此问题,可以使用 inline 关键字来允许不同翻译单元中的多个定义:
// header.h inline int f() { ... }
或者,可以将函数定义移动到单独的源文件中以防止多个定义:
// source.cpp int f() { ... }
以上是为什么 Include Guard 无法防止相互递归和多重定义?的详细内容。更多信息请关注PHP中文网其他相关文章!