芯源半导体CW32
直播中

杨帆

8年用户 1472经验值
私信 关注
[经验]

为什么不建议用匿名结构体

说起匿名结构体,想必大家第一感觉就是看着好高大上的名字,但实际上也就那样。


  • typedef struct {
  •     union {
  •         struct {
  •              uint8_t    bit_0:1
  •             ;uint8_t    bit_1:1
  •             ;uint8_t    bit_2:1
  •             ;
  •         };
  •         uint8_t value;
  •     }info1;
  •     union{
  •         struct {
  •              uint8_t    bit_0:1
  •             ;uint8_t    bit_1:1
  •             ;uint8_t    bit_2:1
  •             ;
  •         };
  •         uint8_t value;
  •     }info2;
  • }info_t;

在这个例子中,下面这个就是所谓的匿名结构体,因为这个 struct 没有名字。


  • struct {
  •      uint8_t    bit_0:1
  •     ;uint8_t    bit_1:1
  •     ;uint8_t    bit_2:1
  •     ;
  • };


因此,在访问这个 bit_0 成员时,直接这样使用就行(这种位域一般在协议对接上用的比较多):


  • void func()
  • {
  •     info_t info;
  •     info.info1.bit_0 = 0;
  •     info.info1.bit_1 = 0;
  •     info.info1.bit_2 = 0;
  •     // or
  •     info.info1.value = 0;
  • }


简单一点,而如果不使用匿名结构体,如加上结构体名字 value_bits:


  • typedef struct {
  •     union {
  •         struct {
  •              uint8_t    bit_0:1
  •             ;uint8_t    bit_1:1
  •             ;uint8_t    bit_2:1
  •             ;
  •         }value_bits;
  •         uint8_t value;
  •     }info1;
  •     union{
  •         struct {
  •              uint8_t    bit_0:1
  •             ;uint8_t    bit_1:1
  •             ;uint8_t    bit_2:1
  •             ;
  •         }value_bits;
  •         uint8_t value;
  •     }info2;
  • }info_t;


使用上稍微麻烦一丢丢:


  • void func()
  • {
  •     info_t info;
  •     info.info1.value_bits.bit_0 = 0;
  •     info.info1.value_bits.bit_1 = 0;
  •     info.info1.value_bits.bit_2 = 0;
  •     // or
  •     info.info1.value = 0;
  • }


因为稍微麻烦一点,鱼鹰以前的代码基本使用匿名结构体,麻烦就来了。

当要把 armcc 编译的代码,转移到 gcc 编译,发现根本编译不过去,直接报错。
error: invalid use of ‘struct data_def::::value_bit’
有可能有方法可以设置 gcc 编译支持匿名结构体,但是鱼鹰也不想深究,改了就是。

因此,为了代码的通用性,建议大家不要写一些奇奇怪怪的代码,否则这样的代码一多,如果出现警告或者错误,改起来也是一件很麻烦的事情。


更多回帖

发帖
×
20
完善资料,
赚取积分