枚举的基础int类型是否有一个保证的宽度
Is there a guaranteed width of the underlying int for an enum?
在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位的表示,即枚举元素只占用一个单词?或者是否存在保证的最小长度,并且只能在int
和long
之间选择?
换句话说,如果我有一个这样的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列表只会有一定的大小,那么在使用时可能值得对其进行类型转换,并且如果超出该大小,还可以断言,至少这是我在发送数据包时使用枚举的方式
相关文章:
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 是否有一个库可以检查C++中的变量类型?
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 有没有办法同时将一个类型分配给C++中的多个模板?
- 是否可以有一个模板函数,可以将向量和非向量类型都作为参数
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C++是否有一个容器,每个类型最多存储一个对象
- C 有一个关键字,允许从派生类引用基本类型
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 错误:在“(”标记之前进行预期的构造函数、析构函数或类型转换.即使我有一个构造函数
- 类有一个自类型的对象
- 我应该为C 中的每种类型都有一个解析器
- C++从文件中读取不同类型的数据,直到有一个以数字开头的字符串
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- 为什么我们有一个类型不匹配
- 为什么嵌套类不能有一个类型为封闭类的成员?
- 为什么std::list可以有一个T类型的分配器
- std::map-C++要求所有声明都有一个类型说明符
- C++要求所有声明都有一个类型说明符
- 是否有一个类型trait来计算构造函数的总数