如何处理typedef'd结构中的循环依赖项

时间:2015-03-12 13:15:19

标签: c struct circular-dependency

我有两个模块,a和b。

A.H:

#ifndef A_H_
#define A_H_

#include "b.h"

typedef struct {
    b_t *b;
    ...
} a_t;

#endif // A_H_

b.h:

#ifndef B_H_
#define B_H_

#include "a.h"

typedef struct {
    a_t *a;
    ...
} b_t;

#endif // B_H_

如何更改它以便编译? (我想保留两个独立的编译单元。)


编辑:我忘了让结构成员指点。

4 个答案:

答案 0 :(得分:5)

使用前瞻声明:

A.H:

struct b_t;

typedef struct a_t {
  struct b_t *b;
} a_t;

b.h:

struct a_t;

typedef struct b_t {
  struct a_t *a;
} b_t;

答案 1 :(得分:5)

[这个答案仅适用于原始问题,其中指针未被用作结构成员]。

这是不可能的。它自然不可能有这样的结构。

让我们说:

struct a {
    struct b b;
    int i;
};

struct b {
    struct a a;
    int i;
};

您对sizeof(struct a)的期望是什么?这个结构会爆炸,编译是不可能的。

然而,如果你让他们转向指针,它可以被编译:

struct a;

struct b {
    struct a *ap;
};

struct a {
    struct b *bp;
};

此代码确实编译:http://ideone.com/GKdUD9

答案 2 :(得分:2)

[此答案仅适用于原始问题,其中指针用作struct成员]。

你不能。

基本上你有

typedef struct {
    b_t b;
} a_t;
typedef struct {
    a_t a;
} b_t;

并且没有前瞻性声明可以帮助您。你在这里有一个不可能的结构:sizeof将是无限的。

答案 3 :(得分:2)

确实这是不可能的。你不能让一个结构成为它自己的成员,甚至不能过渡。但是,当您使用指针时,这是可能的。使用结构声明:

typedef struct a_struct *a_t;

typdef struct {
    a_t a;
} *b_t;

typedef struct a_struct {
    b_t b;
} a_t;