在c语言的结构中定义没有标识符的结构变量意味着什么?
在C语言中,在c语言的结构中定义没有标识符的结构变量意味着什么?,c,structure,C,Structure,在C语言中,struct-Animal的含义是什么第6行? 在C89、C99或C11中是否合法 struct Animal { char *name; int age; }; struct Cat { struct Animal; // line 6 int category; }; 谢谢 这并不意味着什么——事实上,这违反了约束 语言语法允许 struct Animal; 代替结构或联合声明中的成员声明。但它违反了语言规则(6.7.2.1第2段): 一
struct-Animal的含义是什么代码>第6行?
在C89、C99或C11中是否合法
struct Animal {
char *name;
int age;
};
struct Cat {
struct Animal; // line 6
int category;
};
谢谢 这并不意味着什么——事实上,这违反了约束
语言语法允许
struct Animal;
代替结构或联合声明中的成员声明。但它违反了语言规则(6.7.2.1第2段):
一种结构声明,不声明匿名结构或
匿名联合应包含结构声明器列表
这是一个“约束”,这意味着违反它需要诊断。(非致命警告消息可作为诊断。)
如果你写过:
struct Cat {
struct Animal foo;
int category;
};
然后foo
将是一个“声明器”。我上面引用的约束意味着不允许忽略它。默认情况下,gcc和clang都会对此发出警告(“声明不声明任何内容”),并以-Wpedantic错误
拒绝声明
(匿名结构和联合是在C11中添加到语言中的,并且是,但是您问题中的代码不是匿名结构。)这并不意味着什么——事实上,它违反了约束
语言语法允许
struct Animal;
代替结构或联合声明中的成员声明。但它违反了语言规则(6.7.2.1第2段):
一种结构声明,不声明匿名结构或
匿名联合应包含结构声明器列表
这是一个“约束”,这意味着违反它需要诊断。(非致命警告消息可作为诊断。)
如果你写过:
struct Cat {
struct Animal foo;
int category;
};
然后foo
将是一个“声明器”。我上面引用的约束意味着不允许忽略它。默认情况下,gcc和clang都会对此发出警告(“声明不声明任何内容”),并以-Wpedantic错误
拒绝声明
(匿名结构和联合是在C11中添加到语言中的,是的,但您问题中的代码不是匿名结构。)我想它说的是“有一个类型struct Animal
”,仅此而已。它没有做任何有用的事情,因为第1行已经说过了。当我编译它时,我得到x.c:9:18:错误:声明没有声明任何东西[-Werror]
-struct-Animal代码>这是我所期望的。如果我没有使用-Werror
进行编译,这将是一个警告。我在VS2015中使用.c文件尝试了该代码,它编译正常,输出:sizeof(struct-Animal):8 sizeof(struct-Cat):12这看起来在struct-Cat中有一个“struct-Animal”实体。所以我不确定它在C89或C99中是否合法?这是可疑的,但合法。我将GCC设置为非常挑剔,它产生的任何警告都被视为错误。在clang中,它看起来毫无意义,我在xcode9中尝试了代码,它输出:sizeof(struct Animal):16 sizeof(struct Cat):4在Mac上工作,64位编译,并抑制-Werror
选项,我得到的动物的大小是16,猫的大小是4,这正是我所期望的。你在VS2015上的结果很奇怪——我发现很难解释你是如何得到这个结果的。我想它说的是“有一个类型struct Animal
”,仅此而已。它没有做任何有用的事情,因为第1行已经说过了。当我编译它时,我得到x.c:9:18:错误:声明没有声明任何东西[-Werror]
-struct-Animal代码>这是我所期望的。如果我没有使用-Werror
进行编译,这将是一个警告。我在VS2015中使用.c文件尝试了该代码,它编译正常,输出:sizeof(struct-Animal):8 sizeof(struct-Cat):12这看起来在struct-Cat中有一个“struct-Animal”实体。所以我不确定它在C89或C99中是否合法?这是可疑的,但合法。我将GCC设置为非常挑剔,它产生的任何警告都被视为错误。在clang中,它看起来毫无意义,我在xcode9中尝试了代码,它输出:sizeof(struct Animal):16 sizeof(struct Cat):4在Mac上工作,64位编译,并抑制-Werror
选项,我得到的动物的大小是16,猫的大小是4,这正是我所期望的。你在VS2015上的结果很奇怪-我发现很难解释你是如何得到这个结果的。-pedantic errors
让GCC拒绝代码,所以我不确定它是否真的被允许。-pedantic errors
让GCC拒绝代码,所以我不确定它是否真的被允许。