C99标准是否允许匿名枚举类型?
我知道匿名结构体和匿名联合体是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年,且落后两个规范版本,*但这并非你在问题中演示的特性。你展示了 struct 和 union type specifiers没有标签——一个不同但相关的事物,自古代C 引入 struct 和 union 类型以来就存在。举例来说,这些在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 类型,在语法上模仿 struct 和 union 类型。从一开始,这些允许一个标签,但并不要求必须有标签,比如 structs和 unions。并且像未带标签的 struct 和 union 类型一样,未带标签的 enum 类型自C90起至今的所有ISO C版本中都被支持。我看不出在可预见的未来任何版本会因此被移除的理由。
但以匿名 structs和 unions的方式来定义的匿名枚举并不合适,正如 另一条回答 中所详述。任何版本的标准C 都没有定义这样的东西,也没有理由期望它会被引入。尽管 enum type specifiers在语法上与 struct 和 union specifiers相似,但在语义上却大不相同。
所以,并非最近才出现。