web-dev-qa-db-ja.com

C:構造体定義内の構造体へのポインタ

この構造体の定義で次の構造体へのポインタをどのように持つことができますか?

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

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

49
claf

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

typedef struct A A;

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

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

69
CB Bailey

Typedefとforward宣言なしの最初の答えに加えて、これもうまくいくはずです。

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};
59
Chris Young

A*の前にstructがありません

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;
17
Miles D

前方宣言なしで行くことができます:

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

C++ではなくCを使用してください。

構造体を実際にtypedefする必要がある場合(そして、私が一緒に仕事をしているほとんどのプログラマーは¹をしません)、これを行います:

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

_Astruct名前空間)とA(type名前空間)を明確に区別するため。

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

8
ephemient

次のプリプロセッサを使用します。

#define structdef(NAME) typedef struct NAME NAME; struct NAME 

使用法:

structdef(node_t)
{
   void* value;
   node_t* next;
};
0
moien
typedef struct {
 values
} NAME;

これは、構造体をtypedefするためのより短い方法です。最も簡単な表記法だと思います。名前を前ではなく後ろに置いてください。

その後、次のように呼び出すことができます

NAME n;  

NAME *n; // if you'd like a ptr to it.

このアプローチには何か問題がありますか?

0
user7296055