枚举和枚举类的链接兼容性

时间:2012-04-28 07:25:12

标签: c++ linker c++11 abi enum-class

假设有一个使用枚举类的C ++ 11 API:

// api.hpp
enum class E {A, B, C};
void f(E);
...

// api.cpp
void f(E e)
{
    if (e == E::A)
       ...
}

现在假设我想使用这个API,但我没有C ++ 11编译器。所以我:

  • 修改api.hpp并将枚举类更改为常规枚举。
  • 编写一些包含修改后的api.hpp的代码,并正常使用API​​(例如调用f)。
  • 使用我的非C ++ 11编译器编译此代码,并将其链接到使用C ++ 11编译器编译的API实现(使用未修改的api.hpp)。

这似乎适用于海湾合作委员会,但一般来说是安全的,还是我玩火(ODR违规等)?

假设两个编译器在其他方面是链接兼容的,那么只有enum vs. enum类才有问题。

2 个答案:

答案 0 :(得分:5)

就像ildjarn所说,这是未定义的行为。并且这实际上可能在实际实现上失败的原因是普通的C ++ 03枚举没有固定的底层类型。虽然你的枚举类型总是具有“int”作为其底层类型,但是相应的C ++ 03枚举可能具有“short”作为其底层类型,使得代码不是布局兼容的。

答案 1 :(得分:1)

您将违反One Definition Rule(§3.2/ 5)。结果:未定义的行为。

相关问题