來源:公眾號【魚鷹談單片機】
作者:魚鷹Osprey
ID ??:emOsprey
匿名結(jié)構(gòu)體,看著好高大上的名字,但實際上也就那樣。
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;
在這個例子中,下面這個就是所謂的匿名結(jié)構(gòu)體,因為這個 struct 沒有名字。
struct {
uint8_t bit_0:1
;uint8_t bit_1:1
;uint8_t bit_2:1
;
};
因此,在訪問這個 bit_0 成員時,直接這樣使用就行(這種位域一般在協(xié)議對接上用的比較多):
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;
}
簡單一點,而如果不使用匿名結(jié)構(gòu)體,如加上結(jié)構(gòu)體名字 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;
}
因為稍微麻煩一點,魚鷹以前的代碼基本使用匿名結(jié)構(gòu)體,麻煩就來了。
當魚鷹要把 armcc 編譯的代碼,轉(zhuǎn)移到 gcc 編譯,發(fā)現(xiàn)根本編譯不過去,直接報錯。
error:?invalid?use?of?‘struct?data_def::<unnamed?union>::value_bit’
有可能有方法可以設置 gcc 編譯支持匿名結(jié)構(gòu)體,但是魚鷹也不想深究,改了就是。
因此,為了代碼的通用性,建議大家不要寫一些奇奇怪怪的代碼,否則這樣的代碼一多,如果出現(xiàn)警告或者錯誤,改起來也是一件很麻煩的事情。