C语言两种结构体typedef写法的差异及报错原因咨询
C语言两种结构体typedef写法的差异解析
先看你给出的两段代码:
第一段代码:
typedef struct Node{ int data; struct Node *next; }Node;
第二段代码:
typedef struct{ int data; Node *next; }Node;
核心差异与报错原因
第一段代码的逻辑
这段代码同时完成两个操作:- 先定义了带标签的结构体类型
struct Node,C语言在结构体开头声明struct Node标签后,就允许在结构体内部用这个标签引用自身的指针类型(比如struct Node *next); - 再通过
typedef给struct Node起别名Node,后续用struct Node或Node声明变量,本质都是同一个结构体类型。
- 先定义了带标签的结构体类型
第二段代码的报错原因
这段代码定义的是匿名结构体,然后试图给它起别名Node。但结构体内部的Node *next会触发报错:编译器处理结构体内部代码时,typedef定义的别名Node还未生效——别名要等到整个结构体定义完成后才会被识别,此时编译器会把Node当成未声明的类型,直接报错。
struct Node <name>与Node <name>的区别
struct Node <name>是直接用C语言原生的结构体标签类型声明变量;Node <name>是用typedef定义的别名声明变量,在第一段代码的场景下,两者指向完全相同的结构体类型,只是写法不同。
关于结构体是否为同一个的确认
第一段写法里,struct Node和它的别名Node指的是同一个结构体类型,不是两个不同的结构体。可以把Node理解成struct Node的“外号”,两者指代同一个对象。
内容的提问来源于stack exchange,提问作者FirstTree
相关产品推荐
相关产品推荐

