C99标准是否允许匿名枚举类型?

编程语言 2026-07-10

我知道匿名结构体和匿名联合体是GCC的一个扩展,最近被引入到C11标准中:

struct named {
  int type;
  union {
    struct {
      int a;
      int b;
    } case_a;
    struct {
      char *a;
      char *b;
    } case_b;
  } u;
};

我的理解是,这在C99中可能不合法。出于某种原因,至少gcc 9.4.0在 -std=c99 -pedantic条件下似乎允许它。

还有另外一种匿名的:匿名枚举。一个例子:

enum {
  VAL_A = 1,
  VAL_B = 2,
  VAL_C = 3
};

我的问题是,C99标准是否允许匿名枚举?像C11这样的后续版本的C 标准是否允许它们?

解决方案

I know that anonymous structs and anonymous unions are a GCC extension that was recently introduced to the C11 standard [...]

匿名结构体和联合体确实在C11中引入,如今已经15年,且落后两个规范版本,*但这并非你在问题中演示的特性。你展示了 structunion type specifiers没有标签——一个不同但相关的事物,自古代C 引入 structunion 类型以来就存在。举例来说,这些在1978年的K&R《C程序设计语言》第一版中就有清晰且明确的记载。这早于 enum 类型,并且在标准C 的每一个版本中都存在。

does the C99 standard allow anonymous enums? Do later versions of C standards such as C11 allow them?

当C 最初标准化(C89 / C90)时,它包含了 enum 类型,在语法上模仿 structunion 类型。从一开始,这些允许一个标签,但并不要求必须有标签,比如 structs和 unions。并且像未带标签的 structunion 类型一样,未带标签的 enum 类型自C90起至今的所有ISO C版本中都被支持。我看不出在可预见的未来任何版本会因此被移除的理由。

但以匿名 structs和 unions的方式来定义的匿名枚举并不合适,正如 另一条回答 中所详述。任何版本的标准C 都没有定义这样的东西,也没有理由期望它会被引入。尽管 enum type specifiers在语法上与 structunion specifiers相似,但在语义上却大不相同。


所以,并非最近才出现。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章