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

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

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

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

作者:鱼鹰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模型 风险等级 参考价格 更多信息
C0402C103K5RAC7867 1 KEMET Corporation Capacitor, Ceramic, Chip, General Purpose, 0.01uF, 50V, ±10%, X7R, 0402 (1005 mm), -55º ~ +125ºC, 13" Reel

ECAD模型

下载ECAD模型
$0.01 查看
B82559A7103A025 1 TDK Corporation 1 ELEMENT, 10uH, FERRITE-CORE, GENERAL PURPOSE INDUCTOR, SMD, ROHS COMPLIANT

ECAD模型

下载ECAD模型
$8.35 查看
1N4148 1 Daco Semiconductor Co Ltd Rectifier Diode, 1 Element, 0.15A, 100V V(RRM), Silicon, DO-35, GLASS PACKAGE-2
$0.06 查看

相关推荐

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