C99 标准要求用于定义枚举常量值的表达式具有可表示为int
.
在C99 标准的第 6.7.2.2 节第 2 段中:
定义枚举常量值的表达式应为整数常量表达式,其值可表示为
int
.
但是,枚举类型可以由实现定义为与任何整数类型兼容,包括那些值范围在int
.
在C99 标准的第 6.7.2.2 节第 2 段中:
每个枚举类型应与
char
有符号整数类型或无符号整数类型兼容。
这意味着虽然您不能将枚举常量的值显式设置在 an 的范围之外,但如果实现将枚举类型定义为与具有范围的整数类型兼容,则int
枚举常量的值可以在 an的范围之外int
之外int
。
现在我知道了一种获取int
枚举常量集合范围之外的特定值的方法:dummy enumerators。
enum hack{
DUMMY0 = INT_MAX,
DUMMY1,
/* supply as many more dummy enumerators as needed */
...
/* declare desired enumerator */
FOOBAR
};
这要归功于C99 标准的第 6.7.2.2 节第 3 段:
枚举器
=
将其枚举常量定义为常量表达式的值。
...
每个后续的枚举数没有=
定义其枚举常数为常数表达式的值,该值是通过在前一个枚举常数的值上加 1 获得的。
不幸的是,这仅适用于大于的正值INT_MAX
,因为每个后续枚举数的值只会递增。另一个需要注意的是,可能需要创建许多虚拟枚举器来获取所需的特定枚举器。
这导致以下问题:
- 有没有办法将枚举常量的值设置为超出范围的负值
int
? - 有没有更好的方法来设置枚举常数范围之外的正值?
int
- 关于我的虚拟枚举器黑客,C99 标准是否对可以在单个中声明的枚举器数量设置了限制
enum
?