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機能します。型への参照がポインターであるため、サイズがわかっているためのみ機能します。互いの完全なインスタンスを含む 2 つの型が必要であると思われる場合、この方法は使用できません。実際には、メンバーby- valueを含むby-valuestruct Aを含む を宣言することはできません。いずれにせよ、それはかなり無意味であることが判明しました-リンクの1つが参照である必要があります。struct B struct A

于 2012-07-08T12:05:12.770 に答える