これ:
struct Nodetag {
/* ... */
};
という名前のタイプを作成しますstruct Nodetag
。同様に、これは:
struct NODE {
/* ... */
};
という名前のタイプを作成しますstruct NODE
。
どちらの場合でも、その宣言を宣言でラップしてtypedef
、同じ型の 2 番目の名前を作成できます。
typedef struct S {
/* ... */
} T;
struct S
これにより、タイプを asまたは asとして参照できますT
。(ただ呼び出すことはできませんS
が、C ではなく C++ でプログラミングしている場合は呼び出すことができます。)
上記を同等に書くと、次のようになります。
struct S {
/* ... */
};
typedef struct S T;
構造体タグと typedef 名は異なる名前空間にあることに注意してください (「名前空間」という言葉の C++ の意味ではありません)。構造体タグはキーワードの後にのみ続くことができるためstruct
です。したがって、それらを区別する必要はありません。
typedef struct Node {
/* ... */
} Node;
struct Node
これで、タイプを asまたはas として参照できるようになりましたNode
。
このように typedef を追加しても大きな利点はありません。必要に応じて、省略して型を として参照できますstruct Node
。(しかし、多くの C プログラマーは、型に 1 語の名前を使用できることを好み、typedef はそれを行う唯一の良い方法です (a#define
はそれを行う別の方法ですが、良い方法ではありません。)
タグ名を省略して typedef のみを使用することもできます。
typedef struct {
/* ... */
} Node;
これにより、匿名の構造体型が得られ、それを参照する名前がすぐに作成Node
されます。しかし、このアプローチではNode
、構造体の定義が終了するまで名前が表示されないため、構造体にそれ自体へのポインターを含めることはできません。