1

我想声明一个自引用结构如下

    typedef struct
    {
            entry_t *entry;
            node_t *next;
    }node_t;

而不是下面的链接列表

  struct node
  {
         entry_t *entry;
         struct node *next;
  }*head;

这在 C 中有效吗?如果没有,为什么不呢?

4

2 回答 2

6

它不起作用,因为符号/名称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 nodenode_t来创建一个新节点。

于 2012-10-02T05:15:06.263 回答
4

你第二次提到的版本被广泛使用,你可以

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 接受:

在此处输入图像描述

于 2012-10-02T05:16:10.443 回答