7

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

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

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

4

5 回答 5

7

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 获得的常数表达式的值。[...]

因此,在您的语法中,任何符合标准的编译器都将正确运行您的代码。

于 2012-12-07T20:21:31.627 回答
4

正如其他人所说,这是有效的。但我认为到目前为止没有人引用正确的部分。N1256 C99 草案中的相关内容是:6.6“常量表达式”第 6 段:

整数常量表达式 99) 应具有整数类型,并且只能具有整数常量、枚举常量 [...]

然后是 6.7.5.2“数组声明符”第 4 段:

如果大小是整数常量表达式并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型 [...]

所以基本上:

  • 枚举常量是常量表达式
  • 对于数组不是可变长度的,我们需要一个常量表达式

我相信其他人引用的 6.7.2.2 “枚举说明符”谈到了声明enum,而不是使用枚举数。当然,由于在声明它们时需要编译时常量,我们希望它们在表达式中使用时也应该是编译时常量。

于 2015-05-18T20:36:36.400 回答
3

这很好用,即使使用 -ansi -pedantic 标志

所以它不是 GNU 扩展。是的,这在 ANSI C 中很好,因为 an 的成员enum是常量表达式。

于 2012-12-07T20:17:25.663 回答
2

有人可以澄清一下吗?

我相信你知道,枚举只是将标签应用于数字:

enum
{ A,  // 0 
  B,  // 1
  C,  // 2
  LAST  // 3
};

所以真的:

char buf[LAST];

无异于:

char buf[3];
于 2012-12-07T20:20:47.217 回答
1

来自 C 标准,第 6.2.5 段(类型):

16 枚举由一组命名的整数常量值组成。每个不同的枚举构成不同的枚举类型。

17 char 类型、有符号和无符号整数类型以及枚举类型统称为整数类型。

此外,第 6.7.2.2 段(枚举说明符):

定义枚举常量值的表达式应为整数常量表达式,其值可表示为 int。

于 2012-12-07T20:20:38.637 回答