0

このコードでコンパイル エラーが発生する理由がわかりませんでした。

int main()
{
  struct xx
  {
    int x;
    struct yy
   {
    int z;
    struct xx *p;
    };
   struct yy *q;
  };
}
4

3 に答える 3

2

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

なんで最初からそうしなかったの?これらの構造体を「ネストされた」方法で定義するポイントは何ですか?

于 2012-07-09T05:20:42.827 に答える
0

構造体yyは構造体xx内にネストされています。したがって、要素はyyであり、構造xxのインスタンスを介してアクセスされます。構造xxのインスタンスは、既知である必要があります。構造を定義した後にインスタンスが作成された場合、コンパイラはxxに関連するインスタンスを認識しません。したがって、ネストされた構造体yyの場合、メンバーを宣言する必要があります。

于 2012-07-09T05:16:07.713 に答える
0

あなたは;声明で行方不明struct xx* pです。

  struct xx *p;
} *q
于 2012-07-09T05:14:55.780 に答える