在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出現了警告,別小瞧了警告,有時候系統功能不正常可能就是某個警告引起的,爲了避免可能出現的問題,還是選擇了第三種方法。