来源:公众号【鱼鹰谈单片机】
作者:鱼鹰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::union >::value_bit’
有可能有方法可以设置 gcc 编译支持匿名结构体,但是鱼鹰也不想深究,改了就是。
因此,为了代码的通用性,建议大家不要写一些奇奇怪怪的代码,否则这样的代码一多,如果出现警告或者错误,改起来也是一件很麻烦的事情。