避免C头文件中的循环依赖 header1.h ----------------- 结构A{ INTA; B*B; }; 校长2.h ------------------- #包括“header1.h” 类型定义结构b{ int aa; char-bb; int cc; }B; main.c -------------------- #包括 main(){ 结构A*ace; ace=malloc(sizeof(结构A)); ace->b=malloc(sizeof(b)); }
问题:基本上,header1.h需要使用header2.h中定义的结构 进退两难:由于header2.h包括header1.h,如果我在header1.h中包括header2.h,我将引入循环依赖避免C头文件中的循环依赖 header1.h ----------------- 结构A{ INTA; B*B; }; 校长2.h ------------------- #包括“header1.h” 类型定义结构b{ int aa; char-bb; int cc; }B; main.c -------------------- #包括 main(){ 结构A*ace; ace=malloc(sizeof(结构A)); ace->b=malloc(sizeof(b)); },c,header,circular-dependency,C,Header,Circular Dependency,问题:基本上,header1.h需要使用header2.h中定义的结构 进退两难:由于header2.h包括header1.h,如果我在header1.h中包括header2.h,我将引入循环依赖 一些解决方案:解决问题的一种方法是使用空指针,但还有其他方法吗?我尝试转发声明它,但它说“重新定义一个typedef”。通过像这样包装头文件,可以很容易地防止头文件被多次包含 header1.h ----------------- struct A{
一些解决方案:解决问题的一种方法是使用空指针,但还有其他方法吗?我尝试转发声明它,但它说“重新定义一个typedef”。通过像这样包装头文件,可以很容易地防止头文件被多次包含
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));
}
所以你的问题是指针
#ifndef FOO_H_ /* include guard */
#define FOO_H_
/* * * * * insert foo.h here * * * * */
#endif /* FOO_H_ */
在结构A中。由于这是一个指针,不完整的类型是可以的,只要你告诉它这是什么
B *b;
或者您可以使用原型表单:
typedef struct a {
int a;
struct B *b;
} A;
编译器只是想知道指针指向的是什么类型的东西,在您第一次尝试取消引用它之前,它实际上并不关心它的详细外观。我建议在这种情况下使用前向声明,因为结构B仅显示为指针,而不尝试访问它 结构B的任何成员。编译器都会很高兴,我假设只有源代码可以访问这些成员 标题1.h:
struct B;
typedef struct a {
int a;
B *b;
};
添加到您的标题。这不会解决您的问题,但应该是一个风格提示:在include语句上保持一致-不要在非系统提供的标题上使用
,但始终只使用”
。因此它基本上起到了空指针的作用。但它会在以后自行解决吗?或者,每当我使用它时,我都必须强制转换它?struct B
基本上是B的完整声明的原型,它告诉编译器创建指向结构B的指针所需知道的最低限度。创建指针不需要知道类的内部是什么样的,只需要知道它的调用以及它是一个结构(与union或typedef相反)。不要在许多系统/设置中保留前导下划线和大写字母。
struct B;
struct A{
int a;
B *b;
}