以错误的方式定义struct

时间:2012-07-08 11:49:24

标签: 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;
}

似乎我在这里缺少一些基本的东西。为什么A和B的顺序很重要? 是否有可能做到这一点无关紧要?

如果我改变减速顺序一切正常,B先行。

1 个答案:

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