このコードでコンパイル エラーが発生する理由がわかりませんでした。
int main()
{
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
};
struct yy *q;
};
}
このコードでコンパイル エラーが発生する理由がわかりませんでした。
int main()
{
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
};
struct yy *q;
};
}
C 言語では、データ フィールドをすぐに導入しない限り、struct
他の型の中で型を宣言することはできません。struct
つまり、構造体の宣言とデータ フィールドの宣言は、1 つのステップで (1 つの宣言として) 行う必要があります。あなたはその規則に違反しました: あなたの定義は、何の理由もなく定義のstruct yy
中にあるだけです。struct xx
struct yy
の外側で定義をプルstruct xx
するか、struct yy
定義がすぐに のフィールドを宣言することを確認してくださいxx
。
たとえば、これは同じインテントを実装しますが、正しく実行します
struct xx
{
int x;
struct yy
{
int z;
struct xx *p;
} *q; // `struct yy` definition is immediately used to declare field `q`
};
ただし、通常、C 言語では、ネストされた構造体定義を作成する理由はありません。通常は、構造体をネストせずに同じレベルで定義することをお勧めします。
struct yy
{
int z;
struct xx *p;
};
struct xx
{
int x;
struct yy *q;
};
なんで最初からそうしなかったの?これらの構造体を「ネストされた」方法で定義するポイントは何ですか?
構造体yyは構造体xx内にネストされています。したがって、要素はyyであり、構造xxのインスタンスを介してアクセスされます。構造xxのインスタンスは、既知である必要があります。構造を定義した後にインスタンスが作成された場合、コンパイラはxxに関連するインスタンスを認識しません。したがって、ネストされた構造体yyの場合、メンバーを宣言する必要があります。
あなたは;
声明で行方不明struct xx* p
です。
struct xx *p;
} *q