C 结构内部结构

C 结构内部结构,c,struct,compiler-errors,typedef,C,Struct,Compiler Errors,Typedef,我必须创造一个人,每个人都应该有一个冰箱。这是最好的方法吗?如果是,我做错了什么?提前谢谢 typedef struct { int age; struct FRIDGE fridge; } PERSON; typedef struct { int number; } FRIDGE; FRIDGE fr; fr.number=1; PERSON me; me.name=1; me.fridge = fr; 这给了我以下错误: 错误:“冰箱”字段的类型不完整 struct-fredg

我必须创造一个人,每个人都应该有一个冰箱。这是最好的方法吗?如果是,我做错了什么?提前谢谢

typedef struct {
 int age;
 struct FRIDGE fridge;
} PERSON;

typedef struct {
 int number;
} FRIDGE;

FRIDGE fr;
fr.number=1;

PERSON me;
me.name=1;
me.fridge = fr;
这给了我以下错误:

错误:“冰箱”字段的类型不完整


struct-fredge
fredge
不同

您需要在其他结构中使用type
fredge

typedef struct {
 int age;
 FRIDGE fridge;
} PERSON;
或者将您的冰箱定义为
struct fredge

struct FRIDGE {
 int number;
};

此外,在使用该结构之前(例如,在人员上方),可能必须对其进行定义。

在删除所有警告和错误后,必须使用冰箱的成员。在人员之前申报冰箱

me.fredge.number=1


已编辑:我发现了错误。您使用的是匿名结构,因此不应使用
struct
关键字,而应使用
typedef
ed名称

更改结构冰箱
冰箱冰箱

请执行
结构冰箱的正向声明

或者


在struct
PERSON
中使用冰箱之前,先给出冰箱的定义。在结构中使用typedefs会让你陷入这种混乱。struct标记标识符前面的struct关键字是应该如何使用struct的,这也是更明确、更易于阅读的

这里有一篇很长很好的博客文章,里面有所有的细节

但简而言之,你真正想做的是省去typedef,就像这样

struct FRIDGE;  // This is a forward declaration, now an incomplete type

struct PERSON{
 int age;
 struct FRIDGE fridge;
};

struct FRIDGE{
 int number;
};

struct FRIDGE fr;
fr.number=1;

struct PERSON me;
me.name=1;
me.fridge = fr;
Linus Torvalds也谈到了这一点,非常可靠的理由说明为什么在所有的结构上使用typedef是令人困惑和糟糕的


这不是问题,现代C语言支持结构的直接赋值。查看错误消息。如果您对冰箱进行转发声明,则错误消失。建议始终将值分配给结构成员,而不是整个结构,除非执行类似于
memset
的操作。这避免了将来在声明中添加更多结构成员时出现错误。您使用该成员初始化了
fr
,然后将该结构放入另一个结构中。如果添加更多成员,则不会出现任何错误。(此外,有时我希望我的代码在扩展底层结构时失败。这可能是一个有用的提醒,可以添加缺少的初始化。)…更不用说第二行在声明
struct a{struct B xyz;}时为
int
@che:前一行应该是
结构B
结构B的完整定义
否则编译器如何计算
结构B
的大小并知道为最终的
结构a分配多少内存
?您使用的是匿名结构,因此不应使用
结构
关键字,而应使用
类型定义的名称。将
struct FRIDGE FRIDGE
更改为
FRIDGE FRIDGE
@Manav:编辑问题中的代码是错误的答案。编辑问题代码只是为了修正糟糕的格式,比如错误的缩进。@BenVoigt:+1点注释!!!代码确实包含转发声明。但是在这里,转发声明是不够的,要嵌入实例(而不是指针),需要完整的定义。