【问题标题】:What's the right way of using 'typedef'? [duplicate]使用'typedef'的正确方法是什么? [复制]
【发布时间】:2021-02-02 04:16:32
【问题描述】:

我是先这样写代码的

typedef struct 
{   
    struct Node *next;
    int data;
} Node;

因为我知道我可以写struct 而不必像这样在struct 旁边写Node(如果我使用typedef

typedef struct Node
{   
    struct Node *next;
    int data;
} Node;

但是如果我在没有Node 的情况下编写,稍后当我使用Node *cur = head->next 之类的代码时会出现警告

警告标志是:

'警告:使用'struct Node *''类型的表达式初始化'Node *'的指针类型不兼容

(仅供参考,我使用 mac os 和 Visual Studio 代码)

我知道如何解决这个问题,但我不知道为什么在某些编译器中之前的代码可以工作,而在其他一些编译器中却不工作。

定义struct 的最佳方式是什么?是否推荐使用typedef

【问题讨论】:

  • 两者都将结构的typedef创建为Node,但在第一种情况下,结构本身没有标签,而在第二种情况下,它也有标签Node。 Stuct 标记空间和 typedef 不冲突。在第二种情况下,您可以使用Nodestruct Node 来引用结构,在第一种情况下,您只能将类型引用为Node。要声明一个指针,你必须先有一个类型。第二种情况等价于struct Node { struct Node *next; int data; }; typedef struct Node Node; 通过使用标签创建对struct Node的前向引用
  • “一些编译器”可能是指“一些不同语言的编译器”
  • 在第一种情况下,typedef struct 没有为struct Node *next; 提供任何信息
  • 我不知道为什么之前的代码在某些编译器中有效请您告诉我们那些编译器是什么,以便我们尝试。
  • 我正在听一个多年前上传的讲座,老师使用 Microsoft Visual Studio Community 2017 15.7.4 版本。在他的演讲中,C 语言的编译器可以很好地处理该代码

标签: c typedef


【解决方案1】:

在结构定义中,结构名称 (struct Node) 可见,但 typedef (Node) 不可见。您的第一个示例没有为您定义的结构提供任何名称,只有一个给 typedef,因此结构定义中 next 字段的声明是前向声明一个名为 struct Node 的新结构,它不同于您声明的匿名结构,其类型定义为Node

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2019-09-30
    • 2016-09-03
    • 2020-03-12
    • 2012-07-25
    • 2018-05-10
    • 2013-08-31
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多