c++中基于ifdef的继承问题
Problems with ifdef based inheritance in C++
我正在查看我正在使用的某个类的代码,我遇到了这样的代码:
#ifdef SOME_OBSCURE_CONDITION
class A {
#elif
class A : public B {
#endif
这样的代码会有问题吗?
具体来说,假设文件x.p p包含y.h和z.h。z.h和y.h都包含a.h(它定义了类A),但y.h还定义了SOME_OBSCURE_CONDITION。在这种情况下,x.cpp中不存在两个相互冲突的A定义吗?
是的,两个变量同时 将违反ODR(单一定义规则),并可能导致从
- 编译错误 <
- 链接错误/gh>
- 未定义的行为(包括但不限于崩溃)
只要您可以确保SOME_OBSCURE_CONDITION定义是全局相同的(也跨部分构建/链接…),就不会有问题。
如果使用这样的代码结构,则用户有责任正确处理宏。
你能打破它吗?
是的,c++允许你搬起石头砸自己的脚,这取决于你是否这样做。
一般情况下不可能回答。我相信你可以找到方法来打破它,但这对几乎任何事情都是正确的。
保证所有翻译单元看到相同的类型和类定义是您的责任。编译器不需要生成诊断(事实上,如果您想保持模块化编译系统的好处,甚至不可能生成诊断)。
即使不使用任何预处理器,也可以通过给不同的tu提供相同类的不同定义来生成格式不良的代码示例。使用头文件只需要你有一定的纪律。
这种情况的结果是编译失败或运行时未定义的行为。如果需要使用这样的类,请在项目设置中而不是在代码中定义此常量。如果你正在写这门课…那么,最好考虑其他事情,而不要使用条件编译。
相关文章:
- 模板继承问题
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- SIGSEGV 因为基/派生类的继承问题
- C++解决没有虚拟继承的钻石继承问题
- Arduino C 中的继承问题
- C++ 继承问题:未定义对"vtable"的引用
- 班级设计和继承问题
- C 继承问题错误C2084功能已经具有主体
- 如何在C++中解决网格继承问题
- 多重继承问题 C++
- "{"令牌 c++ 继承问题之前的另一个预期类名
- C 模板继承问题(警告和错误)
- 协助解决C++的继承问题
- 在我的示例中,实际上有一些C 继承问题
- 继承问题
- C++继承问题
- C++初学者继承问题
- 公共/受保护/私有继承问题
- 函数继承问题
- 引用类型和继承问题