枚举的基础int类型是否有一个保证的宽度

Is there a guaranteed width of the underlying int for an enum?

本文关键字:有一个 类型 int 枚举 是否      更新时间:2023-10-16

在N2347的例子中,新的强类型枚举 (c++ 11)与当前的(c++ 03)相比的一个优点是用一个"旧"枚举的例子来解释的:

enum Version { Ver1 = 1, Ver2 = 2 };
struct Packet {
    Version ver;
    // ... more data ...
    // bad, size can vary by implementation
   Version getVersion() const { return ver; }
};

我想知道:这里的意思是"变化",编译器甚至可以选择一个8位的表示,即枚举元素只占用一个单词?或者是否存在保证的最小长度,并且只能在intlong 之间选择?

换句话说,如果我有一个这样的Version枚举:

enum VersionXyz { Ver1 = 100, Ver2 = 200 };
struct Packet {
    VersionXyz ver;
    // ... more data ...
};

是否可能在Packet中只需要8bit ?软件更新后:

enum VersionXyz { Ver1 = 100, Ver2 = 200, Ver3=300 };

现在Packet的大小不再相同了因为枚举已经增长了吗?

c++ 03标准的相关段落是§7.2.5:

枚举的基础类型是可以表示所有枚举数值的整型在枚举中定义的。它是由实现定义的,整型被用作底层类型枚举,除非枚举数的值不能装入int或unsigned int类型,否则基础类型不能大于int。如果枚举器列表为空,则基础类型为就好像枚举只有一个值为0的枚举数。应用于枚举类型、枚举类型对象或枚举数的sizeof()的值是应用于对象的sizeof()的值基本类型。

它是实现定义的。唯一可以保证的是,如果您定义了一个枚举,其中所有值都适合int,那么枚举类型的大小不会大于int。(但是由于int的大小也是由实现定义的,所以不能提供太多信息。)

如果你知道你的enum列表只会有一定的大小,那么在使用时可能值得对其进行类型转换,并且如果超出该大小,还可以断言,至少这是我在发送数据包时使用枚举的方式