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

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

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

09/09 13:00
515
阅读需 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模型 风险等级 参考价格 更多信息
0475890001 1 Molex Telecom and Datacom Connector, 5 Contact(s), Female, Right Angle, Surface Mount Terminal, Receptacle, ROHS COMPLIANT
$1.4 查看
CRCW040222R0FKEDHP 1 Vishay Intertechnologies Fixed Resistor, Metal Glaze/thick Film, 0.2W, 22ohm, 50V, 1% +/-Tol, 100ppm/Cel, Surface Mount, 0402, CHIP, HALOGEN FREE AND ROHS COMPLIANT

ECAD模型

下载ECAD模型
$0.12 查看
FDV304P 1 Fairchild Semiconductor Corporation Small Signal Field-Effect Transistor, 0.46A I(D), 25V, 1-Element, P-Channel, Silicon, Metal-oxide Semiconductor FET,
$0.32 查看

相关推荐

电子产业图谱

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