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

HC4*_*ica 6 c++ linker abi c++11 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)
       ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Joh*_*itb 5

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