我希望有两个可以互相包含的结构。这是一个例子:
struct a {
struct b bb;
};
struct b {
struct a aa;
};
但是这段代码没有编译。 gcc说:
test.c:3: error: field ‘bb’ has incomplete type
有没有办法实现这个目标?
答案 0 :(得分:26)
这应该如何运作? a
将包含b
,其中包含a
,其中包含b
等等。
我想你想用指针代替?
struct b;
struct a {
struct b *bb;
};
struct b {
struct a *aa;
};
即使这样的编码风格很糟糕 - 如果可能的话,应该避免使用循环依赖。
答案 1 :(得分:7)
struct a;
struct b;
struct a{
struct b *bb;
};
struct b{
struct a *aa;
};
大多数头文件在定义其成员之前声明了结构。结构定义将在其他地方定义。
答案 2 :(得分:2)
处理这个问题的常用方法是使它们成为指针,然后动态分配它们,甚至只是从另一个结构的静态实例的地址中指定指针。
struct a {
struct b *bb;
};
struct b {
struct a *aa;
};
struct a a0;
struct b b0;
void f(void) {
a0.bb = &b0;
b0.aa = &a0;
}
但是,我建议您寻找一个树状结构的组织。也许两个对象都可以指向常见的第三种类型。
答案 3 :(得分:0)
这是荒谬的。
想象一下,如果你说每个X
包含Y
且每个Y
包含X
,那么每个X
内部都是Y
其中包含X
,而Y
又包含X
,而X
又包含Y
,无限广告。
相反,您可以让{{1}}包含对的引用或(或指向的指针){{1}},反之亦然。< / p>