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
不同
您需要在其他结构中使用typefredge
typedef struct {
int age;
FRIDGE fridge;
} PERSON;
或者将您的冰箱定义为struct fredge
struct FRIDGE {
int number;
};
此外,在使用该结构之前(例如,在人员上方),可能必须对其进行定义。在删除所有警告和错误后,必须使用冰箱的成员。在人员之前申报冰箱
me.fredge.number=1
已编辑:我发现了错误。您使用的是匿名结构,因此不应使用
struct
关键字,而应使用typedef
ed名称
更改结构冰箱
要
冰箱冰箱
请执行结构冰箱的正向声明代码>
或者
在structPERSON
中使用冰箱之前,先给出冰箱的定义。在结构中使用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点注释!!!代码确实包含转发声明。但是在这里,转发声明是不够的,要嵌入实例(而不是指针),需要完整的定义。