• 正文
  • 推荐器件
  • 相关推荐
申请入驻 产业图谱

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

2024/09/09
919
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

来源:公众号【鱼鹰谈单片机

作者:鱼鹰Osprey

ID   :emOsprey

匿名结构体,看着好高大上的名字,但实际上也就那样。

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::<unnamed union>::value_bit’

有可能有方法可以设置 gcc 编译支持匿名结构体,但是鱼鹰也不想深究,改了就是。

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
CW100505-22NJ3 1 Bourns Inc General Purpose Inductor, 0.022uH, 5%, 1 Element, Ceramic-Core, SMD, 0402, CHIP, 0402, HALOGEN FREE AND ROHS COMPLIANT
暂无数据 查看
CS19-12HO1 1 IXYS Corporation Silicon Controlled Rectifier, 29A I(T)RMS, 19000mA I(T), 1200V V(DRM), 1200V V(RRM), 1 Element, TO-220AB, ROHS COMPLIANT, PLASTIC PACKAGE-3
$2.1 查看
0008500105 1 Molex Wire Terminal, LOW HALOGEN, ROHS AND REACH COMPLIANT
$0.13 查看
点赞
收藏
评论
分享
加入交流群
举报

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录