以错误的方式定义struct

qba*_*ler 1 c gcc

有人可以向我解释这段代码有什么问题吗?

#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先行.

D.S*_*ley 7

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成员的值的值.事实证明,无论如何它都是非感性的 - 其中一个链接需要作为参考.