【问题标题】:error C2016: C requires that a struct or union has at least one member from struct错误 C2016:C 要求结构或联合至少有一个来自结构的成员
【发布时间】:2012-04-05 16:00:07
【问题描述】:

当我使用 2 个头文件执行类似操作时:headerfile_1.h 和 headerfile_2.h 我收到错误:错误 C2016:C 要求结构或联合至少有一个来自 headerfile_1.h 中结构 A 定义的成员

在 headerfile_1.h 中

#include "headerfile_2.h"
struct a;

struct a{
    B bb;
}A;

在 headerfile_2.h 中

typedef struct b{
  void (*func0)(A *aa);
}B;

请帮助我理解,我哪里出错了。谢谢。

【问题讨论】:

  • 如果没有A 的定义(在headerfile_1 中),如何在headefile_2 中使用A(甚至不能使用struct A)?

标签: c struct


【解决方案1】:

由于两个头文件之间存在循环依赖关系,因此您尝试执行的操作无效:

头文件_1:

struct A{
    B bb;  /* Use of B, therefore B needs to be defined before A */
};

头文件_2:

typedef struct b{
    void (*func0)(A a); /* Use of A, therefore A needs to be defined before B */
} B;

不可能。

您可以做的一件事是更改func0 的定义以获取指向A 而不是完整对象的指针。这样,您就不需要在B 之前定义A

因此:

头文件_1:

#include "headerfile_2.h"

struct A{
    B bb;
};

头文件_2:

typedef struct A A;

typedef struct b{
    void (*func0)(A *a); /* A * instead of A */
} B;

【讨论】:

    【解决方案2】:

    您提供的代码在不同的地方有错误。我想你想让A 成为typedefstruct a

    最简单的方法是始终将typedef 作为前向声明放在一个头文件中

    typedef struct a A;
    typedef struct b B;
    

    那么你必须以正确的顺序声明struct本身(没有任何其他typedef)。在这里,您的 struct b 只需要一个指向 A 的指针,因此仅使用上面的 typedef 就可以了。但是struct a 需要整个B 而不仅仅是一个指针,所以您的struct a 声明必须查看struct b 的整个声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多