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似乎允许使用无符号int ??
答案 0 :(得分:3)
您的代码无效:
C90(6.5.2.2,枚举说明符):
约束
定义枚举常量值的表达式应该是整数常量表达式,其值可以表示为
int
。
C99(C11草案中未更改)(6.7.2.2,枚举说明符):
约束
- 定义枚举常量值的表达式应为整数常量表达式,其值可表示为
int
。
您的值超出了32位int
的范围,因此这是一个错误(需要诊断)。
请注意,这完全与枚举常量的“初始化程序”有关。例如,如果我们有
enum foo { BAR = 42u };
然后,该约束表明值42u
必须能够容纳在int
中(确实如此;它只是无符号的42,而42容纳在int
中)。 / p>
BAR
本身的类型为int
(令人惊讶的是,不是enum foo
)。
但是,如果您声明类型为enum foo
的变量,则其大小和签名由实现定义。它将基于一些现有的整数类型(可以存储所有枚举值),但是实际使用的类型在实现之间(以及在不同的enum
类型之间也可以不同)。