我需要根据enum
有多少元素来分配一个数组。我做了以下事情:
enum { A, B, C, LAST };
char buf[LAST];
即使使用-ansi -pedantic
标志,也能正常工作。但我不确定它是GCC还是clang(它支持大多数,如果不是所有的GCC扩展)扩展或ANSI C标准真正允许,并且在任何带有ANSI-C标准的C编译器中都能正常工作。有人可以澄清一下吗?
答案 0 :(得分:6)
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.每个后续的枚举数为no =将其枚举常量定义为通过将1加到前一个枚举常量的值而得到的常量表达式的值。 [...]
因此,在您的语法中,任何符合标准的编译器都将正确运行您的代码。
答案 1 :(得分:3)
即使使用-ansi -pedantic flags
也行得很好
所以它不是GNU扩展。是的,这在ANSI C中很好,因为enum
的成员是常量表达式。
答案 2 :(得分:3)
正如其他人所说,这是有效的。但我认为到目前为止还没有人引用过正确的部分。来自N1256 C99 draft的相关内容是:6.6“常量表达式”第6段:
整数常量表达式99)应具有整数类型,并且只能具有整数常量的操作数,枚举常量[...]
然后6.7.5.2“数组声明符”第4段:
如果size是一个整型常量表达式且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型[...]
基本上是这样的:
我相信其他人引用的6.7.2.2“枚举说明符”是关于声明enum
,而不是使用枚举器。当然,因为在声明它们时你需要编译时常量,我们希望它们在表达式中使用时也应该是编译时常量。
答案 3 :(得分:2)
有人可以澄清吗?
我相信你知道,枚举只是将标签贴在一个数字上:
enum
{ A, // 0
B, // 1
C, // 2
LAST // 3
};
真的:
char buf[LAST];
与:
无异char buf[3];
答案 4 :(得分:1)
从C标准,第6.2.5段(类型):
16枚举包含一组命名的整数常量值。每个不同的枚举构成不同的枚举类型。
17 char类型,有符号和无符号整数类型以及枚举类型统称为整数类型。
另外,第6.7.2.2段(枚举说明符):
定义枚举常量值的表达式 是一个整数常量表达式,具有可表示为的值 中间体