enum Some_Flag {
SOME_FLAG_A = 0x00000000u,
SOME_FLAG_B = 0x00000001u,
SOME_FLAG_C = 0x00000002u,
/* ... */
SOME_FLAG_Z = 0x80000000u,
};
uint32_t a;
a = SOME_FLAG_Z;
假设 32 位整数...
这在 C 中有效吗?
该标准对我来说似乎含糊不清。
EDIT:
引用标准:
6.4.4.3 枚举常量
语义学
2 声明为枚举常量的标识符的类型为 int。
前向引用:枚举说明符 (6.7.2.2)。
6.7.2.2 枚举说明符
约束条件
2 定义枚举常量值的表达式应
是一个整数常量表达式,其值可表示为
国际。
语义学
3 枚举器列表中的标识符被声明为常量,
具有 int 类型,并且可以出现在任何允许的地方。127)
带有 = 的枚举器将其枚举常量定义为
常数表达式。如果第一个枚举器没有 =,则其值
枚举常量为 0。随后的每个不带 = 的枚举器定义
其枚举常量作为常量表达式的值
通过将先前的枚举常量的值加 1 来获得。
(使用带有 = 的枚举器可能会产生带有
与同一枚举中的其他值重复的值。)
枚举的枚举数也称为其成员。
4 每个枚举类型应与 char(有符号整数)兼容
类型,或无符号整数类型。类型的选择是
实现定义的,128)但应能够代表
枚举所有成员的值。枚举类型为
直到紧接在终止列表的 } 之后才完整
枚举器声明,然后完成。
C11草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
这些约束似乎清楚地表明枚举是 int,但 6.7.2.2_4 似乎允许无符号整数 ¿
您的代码无效:
C90(6.5.2.2,枚举说明符):
约束条件
定义枚举常量值的表达式应为整型常量表达式,其值可表示为int
.
C99(C11 草案中未更改)(6.7.2.2,枚举说明符):
约束条件
- 定义枚举常量值的表达式应为整数常量表达式,其值可表示为
int
.
您的值超出了 32 位的范围int
,所以这是一个错误(需要诊断)。
请注意,这严格涉及枚举常量的“初始化器”。例如,如果我们有
enum foo { BAR = 42u };
那么这个约束表示该值42u
必须能够适应int
(确实如此;它只是一个无符号 42,并且 42 适合int
).
的类型BAR
本身就是int
(令人惊讶的是,不enum foo
).
但是如果你声明一个类型的变量enum foo
,那么它的大小和符号是实现定义的。它将基于一些现有的整数类型(可以存储所有枚举值),但实际使用的类型在实现之间可能有所不同(以及不同的实现之间)enum
types).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)