anonymous structs匿名结构体

来源:互联网 发布:tbq淘宝权微博 编辑:程序博客网 时间:2024/05/02 04:27

在Keil上编程时这样一个union

typedef union CDATE {uint16_t value;struct {uint16_treserved : 1;uint16_tday : 5;// day: 0-30, 0=1st, 1=2nd, ...uint16_tmonth : 4;// month: 0-11, 0=JANURAY, 1=FEBRARY, ...uint16_tyear : 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

默认设置无法使用匿名结构体,解决的办法:

  1. 给结构体添加名字,比如day,但是使用的时候就必须键入这个名字,比如:
    typedef union CDATE {uint16_t value;struct {uint16_treserved : 1;uint16_tday : 5;// day: 0-30, 0=1st, 1=2nd, ...uint16_tmonth : 4;// month: 0-11, 0=JANURAY, 1=FEBRARY, ...uint16_tyear : 6;// year: 0-63, 0=TIM_YEAR_BASE}date;} CDATE;CDATE date;date.date.day = 1;

  2. 在Misc Controls中添加–gnu
  3. 在code中添加#pragma anon_unions

后两种方法都不需要加入结构体名字,使用时会比较方便,比如:

CDATE date;date.day = 1;

我在使用第二种方法编译时STM32的hal driver出现了警告,别小瞧了警告,有时候系统功能不正常可能就是某个警告引起的,为了避免可能出现的问题,还是选择了第三种方法。

0 0