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