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

时间:2012-12-21 15:34:13

标签: c++ qt serialization enums cross-platform

  

可能重复:
  what is the size of an enum type data in C++?

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

4 个答案:

答案 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的枚举声明,拼写是可选的(Femaleenum 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_tint16_t等。

答案 3 :(得分:0)

它通常与int相同,可以是不同的大小。 See this answer.