在C语言结构中定义不带标识符的struct var是什么意思?

时间:2018-11-20 04:49:39

标签: c structure

在C语言中,第6行中的struct Animal;是什么意思?
在C89,C99或C11中合法吗?

struct Animal {
    char *name;
    int age;
};

struct Cat {
    struct Animal;   // line 6
    int category;
};

谢谢!

1 个答案:

答案 0 :(得分:5)

这没有什么意义-实际上,这是违反约束的情况。

语言语法允许

struct Animal;

代替结构或联合声明中的成员声明。但这违反了语言规则(N1570 6.7.2.1第2段):

  

不声明匿名结构或   匿名联合应包含一个struct-declarator-list。

这是一个“约束”,表示违反该约束需要诊断。 (非致命警告消息可以视为诊断。)

如果您写过:

struct Cat {
    struct Animal foo;
    int category;
};

然后foo将成为“声明符”。我在上面引用的约束意味着您不能忽略它。 gcc和clang都默认发出警告(“声明不声明任何内容”),并用-Wpedantic-errors拒绝。

(C11语言中将匿名结构和联合添加到了discussed here中,但您问题中的代码不是匿名结构。)