【发布时间】:2018-12-08 11:11:57
【问题描述】:
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 中有效吗?
这个标准对我来说似乎模棱两可。
编辑:
引用标准:
6.4.4.3 枚举常量
语义
2 声明为枚举常量的标识符具有 int 类型。 前向引用:枚举说明符 (6.7.2.2)。
6.7.2.2 枚举说明符
约束
2 定义枚举常量值的表达式应 是一个整数常量表达式,其值可表示为 诠释。
语义
3 枚举器列表中的标识符被声明为常量 具有 int 类型,并且可以出现在任何允许的地方。127) 一个 带 = 的枚举器将其枚举常量定义为 常量表达式。如果第一个枚举数没有 =,则它的值 枚举常数为 0。没有 = 的每个后续枚举数定义 其枚举常量作为常量表达式的值 通过将前一个枚举常数的值加 1 获得。 (使用带有 = 的枚举数可能会产生带有 与同一枚举中的其他值重复的值。) 枚举的枚举数也称为其成员。
4 每个枚举类型都应该兼容char,一个有符号整数 类型,或无符号整数类型。类型的选择是 实现定义,128),但应能够表示 枚举的所有成员的值。枚举类型是 直到终止列表的 } 之后才不完整 枚举器声明,然后完成。
约束似乎清楚地表明枚举是一个 int,但是 6.7.2.2_4 似乎允许无符号整数¿?
【问题讨论】:
-
对于 32 位
int然后0x8000u甚至没有接近极限。你的意思是0x80000000u? -
您介意引用这个模棱两可的表述吗?
-
是的,我的意思是,谢谢 :)
标签: c enums unsigned-integer