枚举的底层int是否有保证宽度?

时间:2011-10-04 06:39:23

标签: c++ enums

在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 ...
};

这可能只在8bit中占用Packet。并在软件更新后:

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

现在Packet已经不再具有相同的尺寸因为枚举已经增长了吗?

2 个答案:

答案 0 :(得分:6)

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

  

枚举的基础类型是可以表示所有枚举器值的整数类型   在枚举中定义。 实现定义了哪个整数类型用作底层类型   对于枚举,除了基础类型不应大于int,除非枚举器的值不能适合int或unsigned int。如果枚举器列表为空,则基础类型为   好像枚举有一个值为0的枚举器。应用于枚举类型,枚举类型的对象或枚举器的sizeof()的值是应用于该值的sizeof()的值   基础类型。

所以它的实现是定义的。您唯一可以保证的是,如果您定义一个枚举,其中所有值都适合int,则枚举类型的大小不会大于int。 (但由于int的大小也是实现定义的,因此不会给你太多。)

答案 1 :(得分:0)

如果你知道你的枚举列表只是一个特定的大小,那么在使用它时可能值得输入它,并且如果超过这个大小也有一个断言,至少这就是我在使用枚举时的方式发送数据包