これ:
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、構造体の定義が終了するまで名前が表示されないため、構造体にそれ自体へのポインターを含めることはできません。