【问题标题】:self referential structures in C [duplicate]C中的自引用结构
【发布时间】:2012-10-02 05:10:31
【问题描述】:

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

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

而不是下面的链表

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

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

【问题讨论】:

  • 这在 C 中有效吗? -- 为什么不先试试呢?
  • @liv2hak:显然你可以设法做到这一点(使用不完整的类型和前向声明);看我的回答。

标签: c pointers data-structures linked-list


【解决方案1】:

它不起作用,因为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 来创建新节点。

【讨论】:

  • 补充一点,这里的 C 与 C++ 不同,你不需要专门使用 typedef。在 C 中,一旦遇到 typedefnode_t 将等同于 struct node
  • @Zeta 你也可以使用前向声明,看我的回答。
  • @H2CO3:+1,但前提是 OP“非常非常地希望 [s] 在声明结构本身时就输入名称”,是的。就个人而言,我更喜欢使用您提到的第一个变体,因为我喜欢在使用 typedef 之前或同时完全定义结构。但我想这是编码风格的问题:D
  • @Zeta 我也是,我更喜欢完整类型的,但我想回答 OP 的问题,而不是教他好的做法:D
  • @Zeta, @H2CO3:实际上,我认为将typedef struct foo foo_t; 行放在公共标题中是很常见的,而将foo_t 作为不完整的类型。只要公共接口仅使用 foo_t*s' 并且避免将有关 foo_t 的任何详细信息放在公共标头中,它就可以正常工作。实际的struct foo 定义可以放在库内部头文件中。
【解决方案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 接受:

【讨论】:

  • @caf 你不需要对我做的每一件事都嗤之以鼻。
  • 无需将typedef 设为指向struct 的指针。只需一个普通的typedef 作为structtypedef 的前向声明就可以了。
猜你喜欢
  • 2017-01-02
  • 1970-01-01
  • 2023-02-05
  • 2022-01-07
  • 2012-08-14
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多