C89标准XC32 2.5编译器下如何正确初始化C联合体结构体成员
C89标准下hot_cal_data_t联合体的正确初始化方法
问题定义
涉及的联合体类型定义如下:
#define HOT_INI_DATA_SIZE 14 typedef union { struct { uint8_t OVER_LOAD_TEMP_BYTE_LOW; uint8_t OVER_LOAD_TEMP_BYTE_HI; uint8_t TEMP_CORRECTION_BYTE_LOW; uint8_t TEMP_CORRECTION_BYTE_HI; uint8_t STEAM_CORRECTION_BYTE; uint8_t LEVEL_SENSOR_CALIBR_DATA[HOT_INI_DATA_SIZE - 5]; } fields; uint8_t bytes[HOT_INI_DATA_SIZE]; } hot_cal_data_t;
触发报错的两种错误初始化方式:
- 给每个单字节标量成员额外嵌套大括号,编译器提示存在多余大括号,移除括号后又因层级不匹配触发其他报错:
const hot_cal_data_t initialisationHotData = { {0xD4}, {3}, {0}, {0}, {0}, {16, 16, 16, 16, 16, 16, 16, 16, 16 } };
- 使用C99才支持的指定初始化语法
.fields.xxx,C89编译器无法识别该标识符。
正确初始化写法
注意:C89标准下仅支持初始化联合体的首个声明成员,不支持指定成员名初始化,也无法跳过首个成员直接初始化bytes数组,严格按照成员定义顺序、匹配类型对应的括号层级即可,正确代码如下:
const hot_cal_data_t initialisationHotData = { { 0xD4, 3, 0, 0, 0, {16, 16, 16, 16, 16, 16, 16, 16, 16} } };
语法说明
- 最外层大括号:对应
hot_cal_data_t联合体本身的初始化边界 - 第二层大括号:对应联合体第一个成员
fields结构体的初始化边界,所有结构体成员必须按定义顺序依次赋值 - 单个
uint8_t类型的标量成员直接写值即可,不需要额外套大括号,之前的多余大括号报错就是给这些标量成员嵌套了不必要的括号,导致层级匹配错误 - 最内层大括号对应结构体内部的数组成员
LEVEL_SENSOR_CALIBR_DATA,该数组长度为HOT_INI_DATA_SIZE - 5 = 9,刚好填充9个值16,不存在未初始化元素,完全符合C89语法要求。如果数组初始化值少于元素个数,剩余元素会被编译器自动填充为0。
内容的提问来源于stack exchange,提问作者berntd
相关产品推荐
相关产品推荐

