C语言struct结构体内可否typedef union?相关代码编译报错如何解决
C语言union原理、typedef用法及代码报错排查
union的工作原理
union又叫共用体,核心特性是所有成员共享同一块内存空间:
- 同一时间只能存储一个成员的有效值,修改任意成员都会覆盖其他成员的存储内容
- 整个union的内存大小等于其内部占用空间最大的成员的大小,比如你代码里的Consumption union,double类型占8字节、int类型占4字节,整个union的大小就是8字节
- 非常适合用来表示「同一时间只会出现一种类型」的可变数据场景,比如你示例中不同类型的车辆对应不同的能耗统计单位,用union可以节省内存开销
union的typedef用法
union完全支持typedef操作,作用是给自定义的union类型起一个简短的别名,避免每次声明变量都要加union前缀,常见写法如下:
// 写法1:定义union和typedef分开写 union Consumption { double litre; int kwh; }; typedef union Consumption Consumption; // 写法2:定义union的同时完成typedef(更常用) typedef union Consumption { double litre; int kwh; } Consumption;
完成typedef之后,就可以直接用Consumption作为类型名声明变量,不用再加union前缀。
代码报错原因与修复方案
报错原因
C语言标准不允许在struct的成员定义列表中使用typedef语句,struct内部只能声明成员变量,不能做类型别名定义。你把typedef union Consumption写在了struct Car的内部,因此编译器无法识别,抛出对应报错。
修复方案
方案1:把union的typedef挪到struct定义外部(推荐)
typedef union Consumption{ double litre; int kwh; } Consumption; typedef struct Car{ int age; int weight; enum Type { Tesla, Lada } type; Consumption consumption; } Car;
方案2:如果不需要在struct外部使用这个union类型,可以直接在struct内部定义union并声明成员,去掉typedef即可
typedef struct Car{ int age; int weight; enum Type { Tesla, Lada } type; union Consumption{ double litre; int kwh; } consumption; } Car;
使用注意
使用union时一定要和配套的枚举标记(你的代码里是type字段)对应取值:当type为Tesla时只访问consumption.kwh,当type为Lada时只访问consumption.litre,访问错误会读取到脏数据。
内容的提问来源于stack exchange,提问作者Ferenc Orosi
相关产品推荐
相关产品推荐

