GCC中匿名结构体联合的-Woverride-init警告缺失问题及方案咨询
双24位字段48位类型的定义与初始化警告解决方案
一、更省心的类型定义方案
直接用带__attribute__((packed))属性的结构体就行,不用折腾union,就能实现总计48位的两个24位字段:
#include <stdint.h> // 紧凑的48位结构体,包含两个24位字段 typedef struct { uint32_t a : 24; // 低24位 uint32_t b : 24; // 高24位(内存顺序取决于端序,按需调整即可) } __attribute__((packed)) myType;
- GCC下这个结构体大小就是6字节(48位),
__attribute__((packed))会强制编译器取消位域的对齐填充,让两个24位字段紧紧挨在一起。 - 直接访问
.a和.b就行,初始化时同时赋值两个成员不会有覆盖问题,完全符合C标准的初始化规则。
二、匿名结构体union场景触发-Woverride-init警告的办法
如果非要用union+匿名结构体的写法,想让GCC触发初始化覆盖的警告,试试这两个办法:
- 打开
-Wpedantic警告开关
你写的myType x = {.a = val1, .b = val2};其实违反了C标准(union初始化只能指定一个成员),开了-Wpedantic后,GCC会针对这种不符合标准的初始化行为发出警告。 - 用
-Woverride-init=all替代默认的-Woverride-init
GCC默认的-Woverride-init不会管匿名结构体的成员覆盖初始化,换成-Woverride-init=all就能把这种情况纳入检测范围。
另外要提一句:这种union+双匿名结构体的写法,本质上是让.a和.b共享同一块内存(union成员是重叠的),同时赋值肯定会覆盖,本身就是逻辑上的不合理操作,真心推荐用前面的紧凑结构体方案。
内容的提问来源于stack exchange,提问作者clem822
相关产品推荐
相关产品推荐

