打印
[开发资料]

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

[复制链接]
105|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AdaMaYun|  楼主 | 2024-9-9 19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说起匿名结构体,想必大家第一感觉就是看着好高大上的名字,但实际上也就那样。
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 编译支持匿名结构体,但是鱼鹰也不想深究,改了就是。

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

使用特权

评论回复
沙发
LOVEEVER| | 2024-9-12 13:00 | 只看该作者
匿名结构体最好不要使用,可以直接定义名字进行程序编写

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

227

主题

1689

帖子

3

粉丝