【问题标题】:typedef confusion in CC中的typedef混淆
【发布时间】:2011-12-20 22:27:13
【问题描述】:

我很难理解这个 C 结构中的 typedef。

typedef struct node {
   int   value;
   list  rest;
} node;

typedef struct node *list;

“node”typedef 声明和“list”声明有什么区别?为什么列表以指针开头? “节点”不是指针吗?为什么我不能简单地说“typedef struct node list”并省略星号?我一直在到处寻找,我真的找不到满意的答案。

【问题讨论】:

    标签: c struct typedef


    【解决方案1】:

    第一个typedefnode 定义为struct node 的别名,以便您可以将其简单地称为node,而无需每次都写struct node(在C“常规”类型名称中和@987654326 @ 名称存在于两个不同的命名空间中)。相当于:

    struct node
    {
        int value;
        struct node* rest;
    };
    
    typedef struct node     node;
    

    第二个typedeflist 定义为node * 的别名,即将类型list 定义为指针 指向node 结构。

    (顺便说一下,我个人认为这是一种非常糟糕的风格:在typedefs 中隐藏指针几乎总是一个坏主意;有人可能会争辩说,指向列表中第一个元素的指针可以被识别为列表,但 list 的用法即使是 rest 指针恕我直言不是很好)

    【讨论】:

    • 后半部分我个人并不认同。这里实现的数据结构是一个单链表。将其键入为“只是”一个节点指针会掩盖实际意图。
    • 嗯,我确实同意后一部分,因为我实际上不得不处理这种废话typedef's。
    • @Chuck:正如我所说,我可以理解这种用法​​,但我会使用它来指向列表的头部,而不是每个“下一个”指针。或者,更好的是,我会定义一个单独的struct list { struct node * head; } 以保持list 类型与“只是”struct node * 不同
    • 如果你把typedef放在struct上面,你可以简单地使用node* rest
    • @Dave:我什至可以统一结构声明和 typedef,但我没有做这些“压缩”,因为该代码的真正原因是解释它如何工作以消除任何交叉依赖.
    【解决方案2】:

    node 不是指针;它是structlist 是指向 node 的指针的 typedef。

    你在 C 中 typedefstruct 以避免在任何地方输入 struct node ...

    这是否是一种好的做法值得怀疑(大多数人会同意将指针类型隐藏在 typedef 后面,除非它真的不透明,这是一个坏主意),但这就是它的要点。

    【讨论】:

      【解决方案3】:

      第一个声明说node 是结构。第二个表示list 是指向节点的指针。

      所以,这将是使用这些声明的正确代码:

      list  x;
      node  n;
      
      x = &n;
      

      使用typedef struct node list 声明项目是不正确的。 typedef 语句声明了一个新类型。关键字 typedef 不是类型名称的一部分。

      【讨论】:

        【解决方案4】:

        node 是一个struct,它(令人困惑地)名称与struct node 相同。 list 是指向 struct node 的指针。所以以下是等价的:

        struct node *a;
        node *a;
        list a;
        

        【讨论】:

        • 哇你们太棒了!非常感谢这么!!
        【解决方案5】:

        node 只是struct node同义词

        list 是一个指针,指向struct node(或node

        每个节点实例都包含一个list 指针,它使您能够构建数据结构,例如(单独)linked lists 等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多