C++中两种typedef struct结构体声明写法的区别是什么
问题解答
两种写法均合法有效,核心差异为是否给结构体声明了标签,具体解释如下:
1. 合法性原因
这两种都是C/C++兼容的结构体typedef语法,最终都定义了别名COMPLEX,可以直接用COMPLEX c1;的方式定义结构体变量,使用效果完全一致。
- 第一种写法同时声明了结构体标签
complex,你也可以选择用struct complex c1;的方式定义变量(C++环境下还可以省略struct直接写complex c1;) - 第二种写法是匿名结构体,只能通过typedef定义的别名
COMPLEX来声明变量
2. 结构体标签不是必要项
只有当你需要用到结构体标签的场景时才需要添加,普通场景下可以省略。
3. 适用场景差异
- 带标签的写法适用场景:
- 结构体需要自引用:比如链表、树节点这类需要在结构体内部声明同类型指针的场景,必须加标签,因为typedef的别名在结构体定义完成前还未生效,只能用标签来声明类型:
typedef struct list_node { int value; // 这里不能用ListNode*,只能用struct list_node* struct list_node* next; } ListNode; - 需要前置声明结构体:如果要做封装(比如头文件只暴露结构体声明,实现放在.c文件里),需要用标签做前置声明,匿名结构体无法前置声明:
// 头文件里的前置声明,不需要暴露结构体内部结构 struct complex; void print_complex(struct complex* c); - 兼容旧C代码的编码习惯:部分纯C项目的编码规范要求必须给结构体加标签,方便不同场景下的类型声明
- 结构体需要自引用:比如链表、树节点这类需要在结构体内部声明同类型指针的场景,必须加标签,因为typedef的别名在结构体定义完成前还未生效,只能用标签来声明类型:
- 匿名结构体写法适用场景:
- 不需要自引用、不需要前置声明的普通结构体场景,写法更简洁,不会产生多余的标签污染命名空间
注意:C语言标准库的
<complex.h>头文件定义了complex宏,如果你引入了该头文件,用complex作为结构体标签会出现命名冲突,需要更换标签名。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

