为何两次书写结构体名称?两种typedef结构体写法的差异与用法
C语言结构体typedef的两种写法差异与使用场景
为什么typedef结构体时要写两次名称?
第一次写的是结构体标签(struct tag),用来给这个结构体类型一个归属在struct名下的官方标识;第二次写的是typedef别名,是给结构体类型起的简化别名,不用每次都带struct前缀。这俩并非强制绑定,但带标签的写法能解决匿名结构体做不到的场景。
两种写法的具体差异
写法1:带结构体标签的typedef
typedef struct Point { double x; double y; } Point;
- 同时定义了
struct Point结构体类型,以及它的typedef别名Point - 支持两种变量声明方式:
struct Point p1; // 用结构体标签声明 Point p2; // 用typedef别名声明 - 核心优势:支持结构体自引用。比如定义链表、树节点这类需要内部指向同类型结构体的场景,必须依赖结构体标签:
typedef struct Node { int data; struct Node* next; // 结构体内部只能用标签名引用自身,此时typedef别名还未生效 } Node;
写法2:匿名结构体的typedef
typedef struct { double x; double y; } Point;
- 结构体本身没有标签,只有
Point这一个typedef别名 - 只能用
Point声明变量,无法通过struct XXX的方式调用 - 限制:不能自引用,结构体内部没有可用的标签名指向自身,写
Point* next会报错(typedef别名在结构体定义内部未完全生效) - 优势:写法更简洁,适合定义简单的、无需自引用的结构体类型
适合的搜索词
查询这类问题可以用这些关键词:
- C语言 typedef struct 标签与别名差异
- C anonymous struct vs named struct typedef
- C struct tag 作用
- C 结构体自引用 typedef 写法
内容的提问来源于stack exchange,提问作者Rohit Kumar J
相关产品推荐
相关产品推荐

