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