错误C2016:C要求struct或union至少有一个struct成员

时间:2012-04-05 16:00:08

标签: c struct

当我使用2个头文件执行此类操作时:headerfile_1.h和headerfile_2.h 我得到错误:错误C2016:C要求struct或union至少有一个来自headerfile_1.h中struct 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;

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

2 个答案:

答案 0 :(得分:5)

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

headerfile_1:

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

headerfile_2:

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

不可能。

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

因此:

headerfile_1:

#include "headerfile_2.h"

struct A{
    B bb;
};

headerfile_2:

typedef struct A A;

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

答案 1 :(得分:0)

你给它的代码在不同的地方弄错了。我想您希望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的整个声明。