这与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/

10-13 00:39