我有两个模块,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_
如何更改它以便编译? (我想保留两个独立的编译单元。)
编辑:我忘了让结构成员指点。
答案 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;