【发布时间】:2013-08-08 01:42:47
【问题描述】:
C99 标准要求用于定义枚举常量值的表达式具有可表示为 int 的值。
在第 6.7.2.2 节 C99 标准的第 2 段中:
定义枚举常量值的表达式应为整数 具有可表示为
int的值的常量表达式。
但是,枚举类型可以由实现定义为与任何整数类型兼容,包括那些值范围在int 之外的类型。
在第 6.7.2.2 节 C99 标准的第 2 段中:
每个枚举类型都应兼容
char、有符号整数类型或 无符号整数类型。
这意味着虽然您不能将枚举常量的值显式设置在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范围之外的正值设置为枚举常量? - 关于我的 虚拟枚举器 hack,C99 标准是否对可以在单个
enum中声明的枚举器数量设置了限制?
【问题讨论】:
-
不,你不能。但是,您可以做的是实现自己的使用大数字的枚举函数。但老实说,我不知道你为什么要这样做。
-
@Jocke 枚举函数的实现是什么样的?
-
创建超过 2^32 个枚举时会发生什么?
-
您当然不能将其实现为语法。但作为一个函数,它可以通过一个哈希表来完成,你可以用这些大数字填充这些大数字,并将键作为你自己选择的字符串。
-
据我所知,在这里使用虚拟枚举器没有帮助 - 将前一个枚举常量的值加 1 会导致有符号整数溢出;但是,您的编译器可能支持将枚举提升为更大的整数类型作为非标准扩展......
标签: c enums enumeration c99 language-lawyer