在struct关键字后添加结构体名并设置type alias的作用及重复命名疑问
在struct后添加结构体名称同时设置typedef别名的目的是什么?
这两种写法的核心差异在于结构体是否有显式标签名,重复设置别名的主要目的有以下几点:
1. 支持结构体自引用
如果你的结构体内部需要包含指向自身类型的指针(比如链表节点、树形结构),必须给struct指定标签名。因为typedef的别名是在结构体定义完成后才生效的,匿名结构体(第二种写法)在定义内部无法提前引用这个别名。
比如要给wifiConfig加一个自引用指针,第一种写法完全合法,第二种会直接编译报错:
// 合法写法 typedef struct wifiConfig { char ssid[32]; char password[64]; struct wifiConfig* next; // 用struct标签名实现自引用 } wifiConfig; // 非法写法 typedef struct { char ssid[32]; char password[64]; wifiConfig* next; // 编译时还未识别wifiConfig别名,报错 } wifiConfig;
2. 兼容旧代码与编程规范
有些老的C代码或团队规范要求保留结构体的标签名:
- 调试时(比如用GDB),可以通过
struct wifiConfig直接指代该类型,方便查看内存结构; - 部分遗留代码可能依赖
struct 标签名的声明方式,保留标签名能更好地兼容这类代码。
3. 保留两种声明方式的灵活性
第一种写法中,你既可以用wifiConfig(typedef别名)声明变量,也可以用struct wifiConfig声明,两种方式都合法:
wifiConfig cfg1; // 用别名 struct wifiConfig cfg2; // 用struct标签名
而第二种匿名结构体的写法,只能用wifiConfig这一种方式声明变量。
内容的提问来源于stack exchange,提问作者Damian Dudycz
相关产品推荐
相关产品推荐

