避免C头文件中的循环依赖

时间:2013-11-01 22:48:44

标签: c header circular-dependency

 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”。

3 个答案:

答案 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;   
}