【问题标题】:Struct inside struct结构内部结构
【发布时间】:2012-12-12 00:18:49
【问题描述】:

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

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 关键字,而应使用 typedef'ed 名称。将struct FRIDGE fridge 更改为FRIDGE fridge
  • @Manav:编辑问题中的代码是错误的回答方式。仅编辑问题代码以修复糟糕的格式,例如错误的缩进。
  • @BenVoigt:+1 点注释!!!

标签: c struct compiler-errors typedef


【解决方案1】:

struct FRIDGEFRIDGE 不同。

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

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

或将您的冰箱定义为struct FRIDGE

struct FRIDGE {
 int number;
};

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

【讨论】:

    【解决方案2】:

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

    me.fridge.number = 1

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

    更改struct FRIDGE fridgeFRIDGE fridge

    【讨论】:

    • 这不是问题,现代C语言支持结构的直接赋值。查看错误消息。
    • 如果你前向声明FRIDGE,错误就消失了。始终建议为结构成员而不是整个结构分配值,除非执行类似memset 的操作。这样可以避免将来在其声明中添加更多结构成员时出错。
    • 嗯,这就是原始代码正在做的事情。您已经使用该成员初始化了fr,然后您只是将结构放入另一个结构中。如果您添加更多成员,则不会出现任何错误。 (此外,有时我希望我的代码在扩展底层结构时失败。添加缺少的初始化可能是一个有用的提醒。)
    • ...更不用说您的第二行将冰箱结构分配给int
    • @che: 当你声明struct A { struct B xyz;}; 时,前一行应该是struct B;struct B 的完整定义,否则编译器将如何计算struct B 的大小并知道有多少内存分配给你最后的struct A??
    【解决方案3】:

    要么做struct FRIDGE;的前向声明

    或者,

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

    【讨论】:

    • 代码确实包含前向声明。但是这里的前向声明是不够的,要嵌入实例(而不是指针),还需要完整的定义。
    【解决方案4】:

    在你的结构中使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2013-03-19
      • 2011-06-21
      相关资源
      最近更新 更多