C语言 匿名联合体和匿名结构体
C語言 匿名聯合體和匿名結構體
匿名聯合體和匿名結構體顧名思義,就是沒有名字的聯合體和結構體,沒有名字哪怎么用?拿來用?
在嵌入式數據通信里面,大部分都是使用聯合體,將有實際意義的結構體和字節數組互相轉換。
typedef struct {uint8_t head; //頭uint8_t cmd; //功能字int16_t x; //傳感器x軸數據int16_t y; //傳感器y軸數據int16_t z; //傳感器z軸數據uint8_t end; //尾uint8_t checkSum; //校驗 }Packet_t;typedef union {uint8_t data[10];Packet_t packet; }Datagram_t;Datagram_t datagram;如上所示,如果已經通過 datagram.data 接收到數據,想要從數據中提取傳感器x軸數據,則只要通過 datagram.packet.x 就可以獲取x軸數據。
上面的 Datagram_t 聯合體中可以將 Packet_t packet;成員使用匿名結構體替換
typedef struct {uint8_t head; //頭uint8_t cmd; //功能字int16_t x; //傳感器x軸數據int16_t y; //傳感器y軸數據int16_t z; //傳感器z軸數據uint8_t end; //尾uint8_t checkSum; //校驗 }Packet_t;typedef union {uint8_t data[10];Packet_t; //不給實際名字 }Datagram_t;Datagram_t datagram;這時想要從數據中提取傳感器x軸數據,則只要通過 datagram.x 就可以獲取x軸數據。
但是如果還想要保留 datagram.packet.x 這樣的訪問方式,怎么辦?
#define INHERIT_EX(__TYPE, __NAME) \union \{ \__TYPE; \__TYPE __NAME; \};typedef struct {uint8_t head; //頭uint8_t cmd; //功能字int16_t x; //傳感器x軸數據int16_t y; //傳感器y軸數據int16_t z; //傳感器z軸數據uint8_t end; //尾uint8_t checkSum; //校驗 }Packet_t;typedef union {uint8_t data[10];INHERIT_EX(Packet_t, packet); }Datagram_t;Datagram_t datagram;可以在聯合體 Datagram_t 內部在創建一個匿名聯合體
union { Packet_t; Packet_t packet; };匿名聯合體中再加上一個匿名結構體 Packet_t;
這樣 就可以通過 datagram.x 和 datagram.packet.x 這兩種方式訪問x軸數據。
但是用了匿名聯合體和匿名結構體也就是省略了調用packet 成員的步驟。
就省略了一個步驟,也沒啥太大作用啊!這里的確是沒有發揮太大作用,但是使用C語言開發大型項目,使用面向對象思想開發時,這個就很有用了。尤其是多層繼承時,A結構體繼承與B結構體、B結構體又繼承C結構體… 使用匿名聯合體的優勢就體現出來了,A可以直接調用結構體B、C…的所有成員。
最后嵌入式開發常見的幾個C編譯器比如IAR MDK GCC等都是支持的匿名聯合體和結構體的,如果不支持可以粘貼下面的代碼到自己的系統頭文件中,就可以讓你的匿名代碼在意思幾個環境下獲得支持。
/* ------------------- Start of section using anonymous unions ------------------ */ #if defined(__CC_ARM)#pragma push#pragma anon_unions #elif defined(__ICCARM__)#pragma language=extended #elif defined(__GNUC__)/* anonymous unions are enabled by default */ #elif defined(__TMS470__) /* anonymous unions are enabled by default */ #elif defined(__TASKING__)#pragma warning 586 #else#warning Not supported compiler type #endif總結
以上是生活随笔為你收集整理的C语言 匿名联合体和匿名结构体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 学习笔记(6) 多态
- 下一篇: C# 学习笔记(7) 进程