C & C++ FAQ
|
C | C++ | 自己参照構造体へのtypedef名を与える宣言でエラーが出てしまいます。 |
C |
構造体に与えられる名前nodeは、構造体タグと呼ばれます。この宣言によって作られるのは“node型”ではなく、“struct node型”であることに注意しまょう。すなわち、node単独では型名とはならないのです。struct node { char name[20]; /* 名前 */ struct node *next; /* 後続ノードへのポインタ */ };
はエラーとなります。というのも、メンバnextの宣言時(3行目)においては、まだNode型の宣言が完了していないからです。 構造体の宣言をいったん完了した後にtypedef名を与えるとうまくいきます。すなわち、以下のように宣言しましょう。typedef struct { char name[20]; /* 名前 */ Node *next; /* エラー */ } Node;
なお、以下のように、typedef宣言を先に行うこともできます。struct node { char name[20]; /* 名前 */ struct node *next; /* 後続ノードへのポインタ */ }; typdef struct node Node; /* struct nodeの同義語Nodeを宣言 */
この場合、メンバnextは、Nodeへのポインとして宣言することができます。typdef struct node Node; /* struct nodeの同義語Nodeを宣言 */ struct node { char name[20]; /* 名前 */ Node *next; /* 後続ノードへのポインタ */ };
メンバnextが、Nodeへのポインタではなく、struct nodeへのポインタであることに注意してください。struct node { char name[20]; /* 名前 */ struct node *next; /* 後続ノードへのポインタ */ } Node;
C++ |
と宣言されていれば、node単独で型名となります。すなわち:struct node { char name[20]; /* 名前 */ struct node *next; /* 後続ノードへのポインタ */ };
C言語のようにtypedef名を導入する必要はなく、以下のようにさらに簡潔に宣言することができます。node a; // C++ではOK、Cではエラー struct node b; // C++、CともにOK
メンバnextの宣言においてstructは不要となります。struct node { char name[20]; // 名前 node *next; // 後続ノードへのポインタ };
標準C | §6.5.2.3 | Tags |
標準C99 | §6.7.2.3 | The strcmp function |
標準C++ | §9.2 | Class members |