如何在内部存储枚举数据类型(我想象为8/16/32位int?)并且可以安全地序列化,还是应该使用类似quint8的东西来存储值?换句话说,sizeof(MyEnum)
在所有平台上保证大小相同吗?
答案 0 :(得分:9)
换句话说,sizeof(MyEnum)在所有平台上保证大小相同吗?
您可以在C ++ 11中设置显式类型(但在早期的C ++版本中不是):
enum class Drug : char {
Cocaine,
Cannabis,
Crack
};
或
enum Sex : uint32_t {
Male,
Female,
Other
};
在class
前面使用enum
强制Drug
的用户拼写Drug::Cocaine
,以便在class
之前没有Sex::Male
的枚举声明,拼写是可选的(Female
和enum Frob {
...
FORCE_DWORD = 0x7fffffff
};
都有效)。
2011年之前的C ++的Hacks包括以下内容,它们强制实现最小尺寸:
{{1}}
在实践中看到,例如在ReactOS'DirectX-SDK implementation上。
7.2枚举声明[dcl.enum]
[...]
§6:对于其基础类型未修复的枚举,基础类型是一个整数类型,可以 表示枚举中定义的所有枚举器值。如果没有整数类型可以代表所有 枚举值,枚举是不正确的。它是实现定义的,使用整数类型 作为基础类型,除了基础类型不应大于int,除非a的值 枚举器不能适合int或unsigned int。如果枚举器列表为空,则基础类型为 好像枚举有一个值为0的枚举器。
答案 1 :(得分:3)
绝对不是。枚举的许多特征都是实现定义的。确保选择真实(安全)类型并序列化。
答案 2 :(得分:1)
枚举的大小与int
相同,因此无法保证在任何地方都具有相同的长度。
使用stdint.h
中定义的其中一种类型,例如int32_t
,int16_t
等。
答案 3 :(得分:0)
它通常与int相同,可以是不同的大小。 See this answer.