为什么不包含保护我的头文件免受相互递归的影响包容?
包容警卫正在做他们的工作。该问题是由相互包含的标头中数据结构定义之间的依赖关系引起的。
例如,假设 a.h 和 b.h 包含:
// a.h #ifndef A_H #define A_H #include "b.h" struct A {...}; #endif // b.h #ifndef B_H #define B_H #include "a.h" struct B {...}; #endif
如果没有包含防护,main.cpp 将不会由于编译深度限制而进行编译。
使用包含防护,可以防止无限递归。然而,定义之间的依赖关系仍然存在:
要解决此问题,请在需要它们的标头中使用前向声明:
// b.h #ifndef B_H #define B_H struct A; // Forward declaration struct B {...}; #endif
为什么不包含防止多重定义的守卫?
包含守卫可以防止重新定义在单个翻译单元内,但不能跨不同单元。
例如,当 header.h:
#ifndef HEADER_H #define HEADER_H int f() {...}; #endif
包含在多个翻译单元中时,例如 source1.cpp 和 source2.cpp :
// source1.cpp #include "header.h" // source2.cpp #include "header.h"
链接器会抱怨 f() 的多个定义,因为它在单独的对象中看到相同的定义
要解决此问题,请使用以下方法:
以上是为什么我的包含防护无法防止递归包含和多个符号定义?的详细内容。更多信息请关注PHP中文网其他相关文章!