c++中基于ifdef的继承问题

Problems with ifdef based inheritance in C++

本文关键字:继承 问题 ifdef c++      更新时间:2023-10-16

我正在查看我正在使用的某个类的代码,我遇到了这样的代码:

#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提供相同类的不同定义来生成格式不良的代码示例。使用头文件只需要你有一定的纪律。

这种情况的结果是编译失败或运行时未定义的行为。如果需要使用这样的类,请在项目设置中而不是在代码中定义此常量。如果你正在写这门课…那么,最好考虑其他事情,而不要使用条件编译。