header1.h
-----------------
struct A{
int a;
B *b;
};
header2.h
-------------------
#include"header1.h"
typedef struct b{
int aa;
char bb;
int cc;
}B;
main.c
--------------------
#include<header2.h>
main(){
struct A *ace;
ace = malloc(sizeof(struct A));
ace->b = malloc(sizeof(B));
}
问题:header1.h基本上需要使用header2.h中定义的结构。
困境:由于header2.h包含header1.h,如果我在header1.h中包含header2.h,我将引入循环依赖。
一些解决方案:解决问题的一种方法是使用void指针,但还有其他方法吗?我试着向前声明它,但它说“重新定义一个typedef”。
答案 0 :(得分:4)
所以你遇到的问题是指针
B *b;
结构A中的因为这是一个指针,只要你告诉它这就是不完整的类型就可以了。
typedef struct a {
int a;
struct B *b;
} A;
或者你可以使用原型表格:
struct B;
typedef struct a {
int a;
B *b;
};
编译器只是想知道指针指向的是什么类型的东西 - 在你第一次开始尝试取消引用它之前,它实际上并不关心它的外观。
答案 1 :(得分:3)
您可以通过像这样包装它们来轻松阻止多次包含头文件
#ifndef FOO_H_ /* include guard */
#define FOO_H_
/* * * * * insert foo.h here * * * * */
#endif /* FOO_H_ */
答案 2 :(得分:1)
我建议在这种情况下使用前向声明,因为struct B仅作为指针出现并且不尝试访问 结构B的任何成员。编译器会很高兴,我假设只有源代码才能访问成员。
那么header1.h:
struct B;
struct A{
int a;
B *b;
}