当我使用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;
请帮助我理解,我哪里出错了。感谢。
答案 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
成为typedef
到struct a
?
最简单的方法是始终将typedef
作为前向声明放在一个头文件中
typedef struct a A;
typedef struct b B;
然后,您必须按正确的顺序声明struct
自己的声明(没有任何其他typedef
)。在这里,您的struct b
只需要一个指向A
的指针,所以只有上面的typedef
才可以。但是struct a
需要整个B
而不仅仅是一个指针,因此您struct a
的声明必须看 struct b
的整个声明。