加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

09/09 13:00
639
阅读需 4 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

作者:鱼鹰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模型 风险等级 参考价格 更多信息
XEB1201 1 Okaya Electric America Inc RC Network, Isolated, 0.5W, 120ohm, 0.1uF, Through Hole Mount, 2 Pins, RADIAL LEADED, ROHS COMPLIANT
$4.01 查看
S6015LTP 1 Littelfuse Inc Silicon Controlled Rectifier, 15A I(T)RMS, 600V V(DRM), 600V V(RRM), 1 Element, TO-220AB, ROHS COMPLIANT, PLASTIC, TO-220L, 3 PIN

ECAD模型

下载ECAD模型
$1.6 查看
BSS138PW,115 1 Nexperia BSS138PW - 60 V, 360 mA N-channel Trench MOSFET@en-us SC-70 3-Pin

ECAD模型

下载ECAD模型
$0.13 查看

相关推荐

电子产业图谱

六年开发经验,丰富的KEIL调试经验,STM32使用经验,C语言运用经验。