我需要创建一个人,每个人都应该有一台冰箱。这是最好的方法吗?如果是,那么我做错了什么?提前感谢。
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;
这给我带来了以下错误:
错误:字段“fridge”的类型不完整
我需要创建一个人,每个人都应该有一台冰箱。这是最好的方法吗?如果是,那么我做错了什么?提前感谢。
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;
这给我带来了以下错误:
错误:字段“fridge”的类型不完整
struct FRIDGE
和FRIDGE
是两个不同的东西。
你需要在其他结构中使用类型FRIDGE
。
typedef struct {
int age;
FRIDGE fridge;
} PERSON;
或者将您的冰箱定义为结构体FRIDGE
struct FRIDGE {
int number;
};
此外,在使用结构体之前可能需要定义它的结构(例如,在人物上方)。
在清除所有警告和错误之后,您必须使用FRIDGE
的成员。在声明PERSON
之前声明FRIDGE
。
me.fridge.number = 1
编辑:我发现了错误。您正在使用匿名结构体,因此不应使用struct
关键字,而应使用typedef
定义的名称。
将struct FRIDGE fridge
更改为FRIDGE fridge
FRIDGE
进行前向声明,错误就会消失。除非像memset
一样做某些事情,否则最好为结构成员分配值而不是整个结构。这可以避免在将来添加更多结构成员时出现错误。 - manav m-nfr
,然后只是将结构放入另一个结构中。如果添加更多成员,则不会出现任何错误。(另外,有时候当基础结构被扩展时,我希望我的代码能够失败。这可能是一种有用的提醒,以添加缺少的初始化。) - chestruct A { struct B xyz;};
时,前面一行应该是 struct B;
或者是 struct B
的完整定义。否则编译器如何计算 struct B
的大小并知道为最终的 struct A
分配多少内存呢? - manav m-nstruct 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是令人困惑和不好的。
注: "Original Answer" 翻译成中文为“最初的回答”。要么提前声明struct FRIDGE;
或者,在结构体PERSON
中使用之前,先给FRIDGE
定义。
struct
关键字,而是使用typedef
命名的名称。请将struct FRIDGE fridge
更改为FRIDGE fridge
。 - manav m-n