2

当我对 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;

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

4

2 回答 2

5

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

头文件_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而不是完整对象的指针。这样,您就不需要Abefore的定义B

所以:

头文件_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;
于 2012-04-05T16:07:23.297 回答
0

你给它的代码在不同的地方弄错了。我想你想A成为一个typedefto struct a

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

typedef struct a A;
typedef struct b B;

然后你必须以struct正确的顺序声明它们自己(没有任何其他typedef)。在这里,您struct b只需要一个指向的指针,A因此仅使用typedef上述内容就可以了。但是struct a需要整个B而不只是一个指针,所以你的声明struct a必须看到整个声明struct b

于 2012-04-05T19:03:56.360 回答