13

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

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

4 回答 4

21

struct FRIDGE不同于FRIDGE.

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

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

或将您的冰箱定义为struct FRIDGE

struct FRIDGE {
 int number;
};

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

于 2012-12-26T12:33:23.897 回答
3

FRIDGE删除所有警告和错误后,您必须使用 , 的成员。FRIDGE之前声明PERSON

me.fridge.number = 1

编辑:我发现了这个错误。您正在使用匿名结构,因此您不应使用struct关键字,而应使用typedefed 名称。

更改struct FRIDGE fridgeFRIDGE fridge

于 2012-12-26T12:33:40.670 回答
1

要么做前向声明struct FRIDGE;

或者,

FRIDGE在struct中使用它之前给出定义PERSON

于 2012-12-26T12:35:24.427 回答
1

在你的结构中使用 typedef 会让你陷入这种纠结。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

于 2019-02-12T06:27:01.057 回答