C99标准是否允许匿名枚举?C11等后续标准支持吗?
C标准中匿名枚举的支持情况
C99标准:不允许匿名枚举
C99的语法规则里,枚举声明要么必须指定枚举标签(比如enum my_enum { ... };),要么必须同时声明枚举变量(比如enum { ... } my_var;)。像你给出的enum { VAL_A = 1, VAL_B = 2, VAL_C = 3 };这种既无标签也无变量名的写法,属于GCC的非标准扩展,并不符合C99标准。
你提到GCC 9.4.0在-std=c99 -pedantic参数下允许该写法,这是因为GCC对部分扩展特性在pedantic模式下仍会兼容,并非C99标准本身允许。
C11及后续标准:正式支持匿名枚举
从C11开始,匿名枚举被正式纳入标准,成为合法语法。后续的C17、C23标准也延续了这一支持,也就是说这种无标签、无变量名的枚举声明写法,在C11及之后的标准中是完全合规的,不需要依赖编译器扩展。
补充:关于你提到的匿名结构体/联合体
你给出的示例代码其实是带命名成员的嵌套结构,并非真正的匿名结构体/联合体。标准意义上的匿名结构体/联合体是指无标签且作为成员时无变量名的写法,比如:
struct named { int type; union { // 匿名联合体 struct { int a; int b; }; // 匿名结构体 struct { char *a; char *b; }; // 匿名结构体 }; // 匿名联合体 };
这类写法确实起源于GCC扩展,后来在C11中被纳入标准。
内容的提问来源于stack exchange,提问作者juhist
相关产品推荐
相关产品推荐

