以下のように自己参照構造を宣言したい
typedef struct
{
entry_t *entry;
node_t *next;
}node_t;
以下のリンクリストの代わりに
struct node
{
entry_t *entry;
struct node *next;
}*head;
これはCで動作しますか? いいえの場合、なぜですか?
以下のように自己参照構造を宣言したい
typedef struct
{
entry_t *entry;
node_t *next;
}node_t;
以下のリンクリストの代わりに
struct node
{
entry_t *entry;
struct node *next;
}*head;
これはCで動作しますか? いいえの場合、なぜですか?
node_t
の宣言ではシンボル/名前が不明であるため、機能しませんnext
:
typedef struct
{
entry_t *entry;
node_t *next; /* <-- Error: unknown type */
} node_t;
構造体を「自己参照」にするためには、宣言に名前が必要です。ただし、typedef を保持できます。
typedef struct node
{
entry_t *entry;
struct node *next; /* <-- type struct node is known */
} node_t;
これで、struct node
またはnode_t
を使用して新しいノードを作成できます。
2回目に挙げたバージョンが広く使われており、typedefを次のように作ることができます
typedef struct some_struct_name {
/* other fields, etc... */
struct some_struct_name *next;
} *some_type;
構造自体を宣言するのと同じくらい早く、その型定義された名前が本当にひどく必要な場合は、不完全な型を使用して前方宣言を使用できます。
typedef struct node *node_t;
struct node {
int data;
node_t next;
};
これは C89 でも受け入れられます。