• 正文
  • 推薦器件
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

為什么不建議用匿名結(jié)構(gòu)體?

2024/09/09
932
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

來源:公眾號【魚鷹談單片機

作者:魚鷹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)警告或者錯誤,改起來也是一件很麻煩的事情。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
MSS1048-472NLC 1 Coilcraft Inc General Purpose Inductor, 4.7uH, 30%, 1 Element, Ferrite-Core, SMD, 4039, CHIP, 4039

ECAD模型

下載ECAD模型
$2.1 查看
1803426 1 Phoenix Contact Barrier Strip Terminal Block, 8A, 1 Row(s), 1 Deck(s), ROHS COMPLIANT

ECAD模型

下載ECAD模型
$0.91 查看
2N6073AG 1 Rochester Electronics LLC 400V, 4A, 4 QUADRANT LOGIC LEVEL TRIAC, TO-225, LEAD FREE, CASE 77-09, 3 PIN
$0.85 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄