[开发资料] 为什么不建议用匿名结构体?

[复制链接]
1092|9
 楼主| AdaMaYun 发表于 2024-9-9 19:52 | 显示全部楼层 |阅读模式
说起匿名结构体,想必大家第一感觉就是看着好高大上的名字,但实际上也就那样。
  1. typedef struct {
  2.     union {
  3.         struct {
  4.              uint8_t    bit_0:1
  5.             ;uint8_t    bit_1:1
  6.             ;uint8_t    bit_2:1
  7.             ;
  8.         };
  9.         uint8_t value;
  10.     }info1;
  11.     union{
  12.         struct {
  13.              uint8_t    bit_0:1
  14.             ;uint8_t    bit_1:1
  15.             ;uint8_t    bit_2:1
  16.             ;
  17.         };
  18.         uint8_t value;
  19.     }info2;
  20. }info_t;
在这个例子中,下面这个就是所谓的匿名结构体,因为这个 struct 没有名字。
  1. struct {
  2.      uint8_t    bit_0:1
  3.     ;uint8_t    bit_1:1
  4.     ;uint8_t    bit_2:1
  5.     ;
  6. };

因此,在访问这个 bit_0 成员时,直接这样使用就行(这种位域一般在协议对接上用的比较多):
  1. void func()
  2. {
  3.     info_t info;
  4.     info.info1.bit_0 = 0;
  5.     info.info1.bit_1 = 0;
  6.     info.info1.bit_2 = 0;
  7.     // or
  8.     info.info1.value = 0;
  9. }

简单一点,而如果不使用匿名结构体,如加上结构体名字 value_bits:
  1. typedef struct {
  2.     union {
  3.         struct {
  4.              uint8_t    bit_0:1
  5.             ;uint8_t    bit_1:1
  6.             ;uint8_t    bit_2:1
  7.             ;
  8.         }value_bits;
  9.         uint8_t value;
  10.     }info1;
  11.     union{
  12.         struct {
  13.              uint8_t    bit_0:1
  14.             ;uint8_t    bit_1:1
  15.             ;uint8_t    bit_2:1
  16.             ;
  17.         }value_bits;
  18.         uint8_t value;
  19.     }info2;
  20. }info_t;

使用上稍微麻烦一丢丢:
  1. void func()
  2. {
  3.     info_t info;
  4.     info.info1.value_bits.bit_0 = 0;
  5.     info.info1.value_bits.bit_1 = 0;
  6.     info.info1.value_bits.bit_2 = 0;
  7.     // or
  8.     info.info1.value = 0;
  9. }

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

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

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

LOVEEVER 发表于 2024-9-12 13:00 | 显示全部楼层
匿名结构体最好不要使用,可以直接定义名字进行程序编写
jf101 发表于 2024-9-17 21:11 | 显示全部楼层
建议还是根据数据结构进行数据定义
中国龙芯CDX 发表于 2024-9-18 18:23 | 显示全部楼层
匿名结构体最好不要使用
星辰大海不退缩 发表于 2024-9-20 16:30 | 显示全部楼层
总结一下,建议直接使用普通结构体就好,清晰
szt1993 发表于 2024-9-23 17:26 | 显示全部楼层
还有匿名结构体,第一次听说学习了
小夏天的大西瓜 发表于 2024-9-27 08:43 | 显示全部楼层
这些不清楚的结构体最好不要用
小小蚂蚁举千斤 发表于 2024-10-9 17:41 | 显示全部楼层
为了代码的通用性,建议大家不要写一些奇奇怪怪的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

308

主题

2692

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部