有人可以向我解释这段代码有什么问题吗?
#include<stdio.h>
struct A{
int i;
struct A* parent;
struct B test; // error: field ‘test’ has incomplete type
};
struct B{
struct A* rootParent;
int ref;
int something;
};
int main(){
struct A some, some2;
some.i = 0;
some.parent = &some2;
some.test.rootParent = &some;
some.test.ref = some.test.something = 0;
some2.i =0;
some2.parent = 0;
some2.test.rootParent = 0;
some2.test.ref = some2.test.something = 0;
return 0;
}
似乎我在这里缺少一些基本的东西。为什么A和B的顺序很重要? 是否有可能做到这一点无关紧要?
如果我改变减速顺序一切正常,B先行。
答案 0 :(得分:7)
cnicutar几乎是正确的。这是一个解释和正确的答案,即重新排序声明。
编译器在读取定义时需要计算struct
的大小。在您的情况下,struct B
的大小未知,因此您收到错误。所以你可以在这个简单的情况下交换声明的顺序:
struct B{
struct A* rootParent;
int ref;
int something;
};
struct A{
int i;
struct A* parent;
struct B test;
};
即使struct A
是未知类型,也会有效。它只能起作用,因为对类型的引用是一个指针,所以大小是已知的。如果您认为需要两种类型包含彼此的完整实例,则无法使用此方法。实际上,您无法声明包含struct A
按值的struct B
,其中包含struct A
成员按值。事实证明,无论如何它都是非感性的 - 其中一个链接需要作为参考。