这与Does adding enumerators into enum break ABI?几乎是相同的问题,但是C++ 11引入了enum class
。
对于this page的理解,我可以通过为枚举定义基础类型来拥有稳定的ABI:
enum class Foo : uint32_t
{
x, y, z
}
我会说这很好用,例如
enum class Foo : uint8_t { x = 257 }
不会编译。这意味着编译器不再默默更改枚举的大小,因此我不会破坏二进制兼容性。
我对么?
最佳答案
我相信the accepted answer to the referenced question可以回答有关ABI兼容性的大多数问题。我可以在这里重复一遍,但在那里看不到太多值(value)。
为了解决有关C++ 11范围枚举的特定问题,您的示例:
enum class Foo : uint8_t { x = 257 }
由于格式不正确,因为它需要缩小转换范围,因此该实现需要提供诊断信息,但是如果实现仅向其发出警告,则该实现可以编译。如您所问,编译器不会默默更改基础类型的大小。
我们可以从C++标准草案dcl.enump5中看到这一点:
并从expr.constp5转换常量表达式禁止缩小转换范围:
关于c++ - 使用C++ 11 `enum class`保留ABI兼容性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53381626/