我需要根据有多少元素来分配一个数组enum
。我做了以下事情:
enum { A, B, C, LAST };
char buf[LAST];
这很好用,即使有-ansi -pedantic
标志。但我不确定它是 GCC 还是 clang(它支持大多数,如果不是所有的 GCC 扩展)扩展,还是 ANSI C 标准真的允许,并且在任何带有 ANSI-C std 的 C 编译器中都能正常工作。有人可以澄清一下吗?
C89(第 3.5.2.2 节)和 C99(第 6.7.2.2 节)标准都以相同的方式定义枚举:
6.7.2.2 枚举说明符(第 3 段),http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
3.5.2.2 枚举说明符(第 3 段), http: //flash-gordon.me.uk/ansi.c.txt
两者都读:
[...] 带有 = 的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数没有 =,则其枚举常数的值为 0。每个没有 = 的后续枚举数将其枚举常数定义为通过将前一个枚举常数的值加 1 获得的常数表达式的值。[...]
因此,在您的语法中,任何符合标准的编译器都将正确运行您的代码。
正如其他人所说,这是有效的。但我认为到目前为止没有人引用正确的部分。N1256 C99 草案中的相关内容是:6.6“常量表达式”第 6 段:
整数常量表达式 99) 应具有整数类型,并且只能具有整数常量、枚举常量 [...]
然后是 6.7.5.2“数组声明符”第 4 段:
如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型 [...]
所以基本上:
我相信其他人引用的 6.7.2.2 “枚举说明符”谈到了声明enum
,而不是使用枚举数。当然,由于在声明它们时需要编译时常量,我们希望它们在表达式中使用时也应该是编译时常量。
这很好用,即使使用 -ansi -pedantic 标志
所以它不是 GNU 扩展。是的,这在 ANSI C 中很好,因为 an 的成员enum
是常量表达式。
有人可以澄清一下吗?
我相信你知道,枚举只是将标签应用于数字:
enum
{ A, // 0
B, // 1
C, // 2
LAST // 3
};
所以真的:
char buf[LAST];
无异于:
char buf[3];
来自 C 标准,第 6.2.5 段(类型):
16 枚举由一组命名的整数常量值组成。每个不同的枚举构成不同的枚举类型。
17 char 类型、有符号和无符号整数类型以及枚举类型统称为整数类型。
此外,第 6.7.2.2 段(枚举说明符):
定义枚举常量值的表达式应为整数常量表达式,其值可表示为 int。