“typedef” 的正确用法是什么?

3

我最初是这样编写代码的

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

因为我学到了如果使用typedef,就可以像这样写struct而无需在struct旁边写Node

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

如果我不使用Node,那么当我使用诸如 Node *cur = head->next 的代码时,之后会出现警告。

警告信息如下:

'warning: incompatible pointer types initializing 'Node *' with an expression of type 'struct Node *''

(我的系统是 Mac OS,并使用 Visual Studio Code)

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

而且,定义结构体的最佳方式是什么?使用typedef是否推荐?


两者都创建了结构体的typedef为Node,但在第一种情况下,结构体本身没有标签,而在第二种情况下,它也有标签Node。结构体标签空间和typedef不会冲突。在第二种情况下,您可以使用Nodestruct Node来引用结构体,在第一种情况下,您只能将类型称为Node。要声明指针,必须先有一个类型。第二种情况相当于struct Node { struct Node *next; int data; }; typedef struct Node Node; 通过使用标签,您可以创建对struct Node的前向引用。 - David C. Rankin
1
你所说的“一些编译器”,可能是指“其他语言的一些编译器”。 - M.M
1
在第一种情况下,typedef struct 不为 struct Node *next; 提供任何信息。 - David C. Rankin
我不知道为什么在一些编译器中之前的代码可以工作,请问您能告诉我们是哪些编译器吗,这样我们就可以尝试一下。 - IrAM
我正在听一场几年前上传的讲座,老师使用的是Microsoft Visual Studio Community 2017 15.7.4版本。在他的讲座中,C语言编译器与那段代码完美地配合工作。 - hyun
1个回答

1
在结构体定义中,结构体的名称(struct Node)是可见的,但是typedef(Node)不可见。你的第一个例子没有给你所定义的结构体任何名字,只给了一个typedef的名字,因此结构体定义中next字段的声明是在前向声明一个名为struct Node的新结构体,这与你声明的匿名结构体并使用typedef命名为Node是不同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接