58

この構造体の定義で次の構造体へのポインターを取得するにはどうすればよいですか。

typedef struct A {
  int a;
  int b;
  A*  next;
} A;

これは私が最初に書いた方法ですが、機能しません。

4

7 に答える 7

78

typedefを定義し、最初に1つのステートメントで構造体を前方宣言し、次に後続の定義で構造体を定義できます。

typedef struct A A;

struct A
{
    int a;
    int b;
    A* next;
};

編集:他の人が述べたように、前方宣言がなくても、構造体名は構造体定義内で有効です(つまり、使用できますstruct A)が、typedef定義が完了するまで、typedefは使用できません(したがって、使用Aは有効ではありません) )。これは、1つのポインター・メンバーだけではそれほど重要ではないかもしれませんが、多くの自己型ポインターを持つ複雑なデータ構造を持っている場合は、あまり使い勝手が悪いかもしれません。

于 2009-02-03T08:43:50.087 に答える
65

最初の答えに加えて、typedefと前方宣言がなければ、これも問題ないはずです。

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};
于 2009-02-03T08:45:40.363 に答える
21

あなたはstruct前に行方不明ですA*

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
于 2009-02-03T08:48:02.417 に答える
14

前方宣言なしで進むことができます:

struct A {
    int a;
    int b;
    struct A *next;
};
于 2009-02-03T08:46:56.740 に答える
9

お願いします、あなたは C++ ではなく C を使用しています。

本当に構造体を型定義する必要がある場合 (そして、私が一緒に仕事をしているほとんどのプログラマーはそうしません¹)、次のようにします。

typedef struct _A {
    int a;
    int b;
    struct _A *next;
} A;

_A(struct名前空間内) と(型名前空間内)を明確に区別するためA

¹typedefは、それが指す型のサイズとストレージを隠します - C のような低レベル言語では、何かを隠そうとすることは有害で非生産的であるという議論 (そして私も同意します) です。struct Aいつでも入力することに慣れてくださいstruct A

于 2009-02-03T21:34:12.340 に答える