枚举成员可以是ANSI-C中数组的大小吗?

时间:2012-12-07 20:13:19

标签: c gcc standards clang c89

我需要根据enum有多少元素来分配一个数组。我做了以下事情:

enum { A, B, C, LAST };
char buf[LAST];

即使使用-ansi -pedantic标志,也能正常工作。但我不确定它是GCC还是clang(它支持大多数,如果不是所有的GCC扩展)扩展或ANSI C标准真正允许,并且在任何带有ANSI-C标准的C编译器中都能正常工作。有人可以澄清一下吗?

5 个答案:

答案 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段(枚举说明符):

  

定义枚举常量值的表达式   是一个整数常量表达式,具有可表示为的值   中间体