
來源:公眾號【魚鷹談單片機】
作者:魚鷹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;// orinfo.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;// orinfo.info1.value = 0;}
因為稍微麻煩一點,魚鷹以前的代碼基本使用匿名結構體,麻煩就來了。
當魚鷹要把 armcc 編譯的代碼,轉移到 gcc 編譯,發現根本編譯不過去,直接報錯。
error:?invalid?use?of?‘struct?data_def::union >::value_bit’有可能有方法可以設置 gcc 編譯支持匿名結構體,但是魚鷹也不想深究,改了就是。
因此,為了代碼的通用性,建議大家不要寫一些奇奇怪怪的代碼,否則這樣的代碼一多,如果出現警告或者錯誤,改起來也是一件很麻煩的事情。