1

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

#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优先。

4

1 回答 1

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;
};

即使struct A是未知类型,它也会起作用。它之所以有效,是因为对类型的引用是一个指针,因此大小是已知的。如果您认为您需要两个包含彼此完整实例的类型,那么您不能使用此方法。事实上,您不能声明struct A包含一个包含成员by-valuestruct B by-value 的 a 。事实证明,无论如何它都是相当荒谬的——其中一个链接必须是参考。struct A

于 2012-07-08T12:05:12.770 回答