在Keil上编程时这样一个union
typedef union CDATE {
uint16_t value;
struct {
uint16_t reserved : 1;
uint16_t day : 5; // day: 0-30, 0=1st, 1=2nd, ...
uint16_t month : 4; // month: 0-11, 0=JANURAY, 1=FEBRARY, ...
uint16_t year : 6; // year: 0-63, 0=TIM_YEAR_BASE
};
} CDATE;
编译器报错:error: #3093: anonymous structs are only supported in –gnu mode, or when enabled with #pragma anon_unions
默认设置无法使用匿名结构体,解决的办法:
- 给结构体添加名字,比如day,但是使用的时候就必须键入这个名字,比如:
typedef union CDATE { uint16_t value; struct { uint16_t reserved : 1; uint16_t day : 5; // day: 0-30, 0=1st, 1=2nd, ... uint16_t month : 4; // month: 0-11, 0=JANURAY, 1=FEBRARY, ... uint16_t year : 6; // year: 0-63, 0=TIM_YEAR_BASE }date; } CDATE; CDATE date; date.date.day = 1;
- 在Misc Controls中添加–gnu
- 在code中添加#pragma anon_unions
后两种方法都不需要加入结构体名字,使用时会比较方便,比如:
CDATE date;
date.day = 1;
我在使用第二种方法编译时STM32的hal driver出现了警告,别小瞧了警告,有时候系统功能不正常可能就是某个警告引起的,为了避免可能出现的问题,还是选择了第三种方法。