打印
[开发资料]

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

[复制链接]
453|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
匿名结构体最好不要使用,可以直接定义名字进行程序编写

使用特权

评论回复
板凳
jf101| | 2024-9-17 21:11 | 只看该作者
建议还是根据数据结构进行数据定义

使用特权

评论回复
地板
中国龙芯CDX| | 2024-9-18 18:23 | 只看该作者
匿名结构体最好不要使用

使用特权

评论回复
5
星辰大海不退缩| | 2024-9-20 16:30 | 只看该作者
总结一下,建议直接使用普通结构体就好,清晰

使用特权

评论回复
6
szt1993| | 2024-9-23 17:26 | 只看该作者
还有匿名结构体,第一次听说学习了

使用特权

评论回复
7
小夏天的大西瓜| | 2024-9-27 08:43 | 只看该作者
这些不清楚的结构体最好不要用

使用特权

评论回复
8
小小蚂蚁举千斤| | 2024-10-9 17:41 | 只看该作者
为了代码的通用性,建议大家不要写一些奇奇怪怪的代码

使用特权

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

本版积分规则

240

主题

1848

帖子

3

粉丝