我想声明一个自引用结构如下
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
来创建一个新节点。
你第二次提到的版本被广泛使用,你可以像
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 接受: