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

4

3 回答 3

4

所以你遇到的问题是指针

B *b;

在结构 A 中。因为这是一个指针,所以只要你告诉它这是一个不完整的类型就可以了。

typedef struct a {
    int a;
    struct B *b;
} A;

或者您可以使用原型形式:

struct B;
typedef struct a {
    int a;
    B *b;
};

编译器只是想知道指针指向什么类型的东西——就在这里,它实际上并不关心它看起来更详细的样子,直到你第一次开始尝试取消引用它。

于 2013-11-01T23:02:50.363 回答
3

通过像这样包装它们,您可以轻松地防止头文件被多次包含

#ifndef FOO_H_ /* include guard */
#define FOO_H_

/* * * * * insert foo.h here * * * * */

#endif /* FOO_H_ */
于 2013-11-01T22:55:12.803 回答
1

我建议在这种情况下使用前向声明,因为 struct B 仅作为指针出现,并且不要尝试访问 struct B 的任何成员。编译器会很高兴,我假设只有源代码可以访问成员。

header1.h:

struct B;

struct A{
    int a;
    B *b;   
}   
于 2018-05-04T15:23:27.623 回答