结构内部结构

时间:2012-12-26 12:31:01

标签: 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;

这给了我以下错误:

  

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

4 个答案:

答案 0 :(得分:19)

struct FRIDGEFRIDGE不同。

您需要在其他结构中使用FRIDGE类型。

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

或将冰箱定义为struct FRIDGE

struct FRIDGE {
 int number;
};

此外,可能必须在使用之前定义结构(例如,在人的上方)。

答案 1 :(得分:3)

删除所有警告和错误后,您必须使用FRIDGE的成员。在FRIDGE

之前声明PERSON

me.fridge.number = 1

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

更改struct FRIDGE fridgeFRIDGE fridge

答案 2 :(得分:1)

要么struct FRIDGE;

的前向声明

或者,

在结构FRIDGE

中使用之前给出PERSON的定义

答案 3 :(得分:0)

将typedef与结构一起使用将使您陷入这种纠结。 struct标签标识符前面的struct关键字是应该使用struct的方式,这也更加明确和易于阅读。

这里有一篇长而良好的博客文章,其中包含所有详细信息 https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/

但是简而言之,您真正想要做的就是省去像这样的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会令人困惑和糟糕。

https://yarchive.net/comp/linux/typedefs.html