Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言的结构中定义没有标识符的结构变量意味着什么?_C_Structure - Fatal编程技术网

在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段): 一

在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 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拒绝代码,所以我不确定它是否真的被允许。