A.H
#ifndef A
#define A
#include "B.h"
typedef struct {
B* b;
} A;
void InitA(A* a) {
a->b=malloc(sizeof(B));
}
#endif
B.h
#ifndef B
#define B
#include "A.h"
typedef struct {
A* a;
} B;
void InitB(B* b) {
b->a=malloc(sizeof(A));
}
#endif
我尝试过这样的,比如c ++和typedef。 typedef在类型之间产生冲突错误,之前的声明就在这里等等。
感谢。
答案 0 :(得分:1)
这是修复它的一种方法:
A.H:
#ifndef A_H_
#define A_H_
typedef struct A
{
struct B* b;
} A;
#include "b.h"
void InitA(A* a)
{
a->b = malloc(sizeof(B));
}
#endif
b.h:
#ifndef B_H_
#define B_H_
typedef struct B
{
struct A* a;
} B;
#include "a.h"
void InitB(B* b)
{
b->a = malloc(sizeof(A));
}
#endif
main.c中:
#include <stdlib.h>
#include "a.h"
#include "b.h"
int main(void)
{
A a;
B b;
InitA(&a);
InitB(&b);
return 0;
}
问题是,要使sizeof()
起作用,其参数必须是已知类型。在A
和B
中执行sizeof(A)
和sizeof(B)
时,您的代码InitA()
和InitB()
尚不完全清楚。重新排列类型定义,文件包含和函数定义的顺序可以解决这个问题。
答案 1 :(得分:0)
好的,我们一步一步走。
让我们看看如果您想要包含其中一个文件会发生什么情况,例如:A.h
:
A.h
将包含B.h
B.h
将包含A.h
,由于标题保护而会被跳过。B.h
使用A* a;
,其中A是未知类型,此时您将收到编译错误。你必须转发声明这样的类型:struct A;
(在B.h
中,在结构定义之前)。
类似的推理适用于其他文件(struct B;
)