专栏名称: 21ic电子网
即时传播最新电子科技信息,汇聚业界精英精彩视点。
目录
相关文章推荐
OFweek维科网  ·  八家面板厂披露8月财报! ·  5 天前  
OFweek维科网  ·  创维抛售LGD广州LCD工厂所有股权! ·  4 天前  
半导体行业联盟  ·  思瑞浦并购创芯微,获批准!国产模拟芯片! ·  4 天前  
21ic电子网  ·  国产MCU专栏 ... ·  5 天前  
21ic电子网  ·  官宣!电信巨头大裁员,遣散费135亿元! ·  4 天前  
51好读  ›  专栏  ›  21ic电子网

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

21ic电子网  · 公众号  · 半导体  · 2024-09-09 18:34

正文

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

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

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

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

温馨提示:

因最近微信公众平台推送规则改变,很多读者反馈没有及时看到更新的文章。根据最新规则,建议多点击“推荐阅读、分享、收藏”等,成为常读用户。


推荐阅读:


请点下【在看】给小编加鸡腿