2

互いに参照する 2 つの構造体を作成する方法について、私は混乱していました。以前のような質問は見つかりませんでした。
だから、私はこれがうまくコンパイルされることを知っています:

    struct MyStruct {
        MyStruct* p;
    };

しかし、例えば、

    struct A {
        B* pBstruct;
    };
    struct B {
        A* pAstruct;
    };

これはコンパイルされません。

4

2 に答える 2

5

タイプを知らせるには、前方宣言が必要です。

struct B;
struct A {
    B* pBstruct;
};
struct B {
    A* pAstruct;
};
于 2012-11-19T23:23:15.640 に答える
2

だから、私はそれを尋ねたことを知っていますが、私はそれを理解し、それに答えることが他の人を助けるかもしれないと考えました.

再帰関数を作成するのと同じように、構造体もプロトタイプ化する必要があります。
したがって、再帰関数を作成することを検討してください。

    int fnc_a();
    int fnc_b();

    int fnc_a()
    {
        fnc_b();
    }
    int fnc_b()
    {
        fnc_a();
    }

最初の 2 行は、実際の定義/宣言が提供される前に使用できるように、関数のプロトタイプとして識別されます。
ここで、2 つの再帰構造体を再度作成することを検討してください。

    struct A;
    struct B;
    struct A {
        B* pBstruct;
    };
    struct B {
        A* pAstruct;
    };

これらの最初の 2 行は、宣言される前に使用できるように、2 つの構造体の存在を宣言します。(B struct プロトタイプだけが必要であるという事実についてわざわざコメントしないでください - 私はそれを認識しています)

最後に、構造体変数ではなく、構造体の「ポインター」変数を使用することを忘れないでください。これは、無限に大きな構造を作成するため、コンパイルされません。

    struct A;
    struct B;
    struct A {
        B pBstruct;
    };
    struct B {
        A pAstruct;
    };
于 2012-11-19T23:34:04.987 に答える