C 什么';这是使用';typedef';?

C 什么';这是使用';typedef';?,c,typedef,C,Typedef,我是用这种方式写代码的 typedef struct { struct Node *next; int data; } Node; 因为我知道我可以写struct,而不用像这样在struct旁边写Node(如果我使用typedef) 但是,如果我不使用节点,那么当我使用像节点*cur=head->next这样的代码时,会出现警告 警告标志是: '警告:不兼容的指针类型正在使用'struct Node*'类型的表达式初始化'Node*'' (仅供参考,我使用mac os和

我是用这种方式写代码的

typedef struct 
{   
    struct Node *next;
    int data;
} Node;
因为我知道我可以写
struct
,而不用像这样在
struct
旁边写
Node
(如果我使用
typedef

但是,如果我不使用
节点
,那么当我使用像
节点*cur=head->next这样的代码时,会出现警告

警告标志是:

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

(仅供参考,我使用mac os和visual studio代码)

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


定义结构的最佳方法是什么?是否建议使用
typedef

在结构定义中,结构(
struct Node
)的名称可见,但typedef(
节点
)不可见。第一个示例没有给正在定义的结构命名,只给typedef命名,因此结构定义中的
next
字段的声明是向前声明一个名为
struct Node
的新结构,这与您声明的类型定义为
Node

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