避免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头文件中的循环依赖 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{

问题:基本上,header1.h需要使用header2.h中定义的结构

进退两难:由于header2.h包括header1.h,如果我在header1.h中包括header2.h,我将引入循环依赖


一些解决方案:解决问题的一种方法是使用空指针,但还有其他方法吗?我尝试转发声明它,但它说“重新定义一个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;   
}