在c语言的结构中定义没有标识符的struct var时意味着什么?

Rin*_*Yee 1 c structure

在C语言中,struct Animal;第6行的含义是什么?
在C89或C99或C11中是否合法?

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

struct Cat {
    struct Animal;   // line 6
    int category;
};
Run Code Online (Sandbox Code Playgroud)

谢谢!

Kei*_*son 5

它并不意味着什么 - 事实上它是违反约束的.

语言语法允许

struct Animal;
Run Code Online (Sandbox Code Playgroud)

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

不声明匿名结构或匿名联合的结构声明应包含struct-declarator-list.

这是一个"约束",这意味着违反它需要诊断.(非致命警告消息有资格作为诊断.)

如果你写了:

struct Cat {
    struct Animal foo;
    int category;
};
Run Code Online (Sandbox Code Playgroud)

foo将是一个"声明者".我上面引用的约束意味着你不允许省略它.gcc和clang都默认警告这个("声明不声明任何东西")并拒绝它-Wpedantic-errors.

(在C11中将匿名结构和联合添加到语言中,并在此处讨论,但您的问题中的代码不是匿名结构.)