在C++中是枚举类型的跨平台吗?

jah*_*aho 2 c++ enums serialization qt cross-platform

可能重复:
C++中枚举类型数据的大小是多少?

如何在内部存储枚举数据类型(我想象为8/16/32位int?)并且可以安全地序列化,还是应该使用像quint8这样的值来存储值?换句话说,sizeof(MyEnum)在所有平台上保证大小相同?

Seb*_*ach 9

换句话说,sizeof(MyEnum)保证在所有平台上都是相同的大小?

您可以(但设置C++ 11明确的类型没有在早期C++的化身):

enum class Drug : char {
    Cocaine,
    Cannabis,
    Crack
};
Run Code Online (Sandbox Code Playgroud)

要么

enum Sex : uint32_t {
    Male,
    Female,
    Other
};
Run Code Online (Sandbox Code Playgroud)

class前面enum的方式迫使用户Drug拼一下Drug::Cocaine,对枚举没有class在他们的声明前,拼写是可选的(既Sex::MaleFemale有效).

2011年之前用于C++的Hacks包括以下内容,它们强制实现最小尺寸:

enum Frob {
    ...
    FORCE_DWORD          = 0x7fffffff
};
Run Code Online (Sandbox Code Playgroud)

在实践中看到例如ReactOS的DirectX-SDK实现.


标准参考

7.2枚举声明[dcl.enum]

[...]

§6:对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值.如果没有整数类型可以表示所有枚举器值,则枚举是不正确的.它是实现定义的,其中整数类型用作 底层类型,除了底层类型不应大于int,除非枚举器的值不能适合int或unsigned int.如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器一样.