C語言關鍵字union的使用

在C語言中關鍵字union和struct用法是一樣的,而且在項目中struct隨處可見。在我的專欄" "中我詳細的講解了它們的異同。很多人編碼了多年也許會認為有struct就夠了,要union幹嘛,感覺union的存在有些雞肋,但是事實真的是這樣嗎?下面讓我來告訴你哪些應用場景union是不能被struct替代的,而且使用union也是唯一能夠很好的解決問題的。

我在專欄裡 裡介紹過位域這個知識點,裡面我也書寫了個非常經典的例程。經常和微控制芯片(MCU)打交道的嵌入式工程師對位操作一定不陌生,也經常接觸各類的中斷(中斷是指在程序運行的過程中,出現一些"異常"情況,需要MCU干預並轉入中斷處理情況,處理完後重新運行原程序的過程。計算機的運行就是靠中斷來維持的,鍵盤中斷,鼠標中斷,屏幕顯示中斷,揚聲器中斷等等)。現在我使用聯合和位域相結合的辦法可以很好的表示它們。比如我定義如下聯合體:

C語言關鍵字union的使用

當我們要去使用各個中斷的時候,直接使用uint8_t類型的數據很不直觀,但是使用裡面的位域卻可以很好的表達。此時只能使用聯合體而不能使用結構體。

現在讓我們來看看怎麼使用它。我先定義兩個開關中斷的宏,定義如下:

C語言關鍵字union的使用

使用如下:

C語言關鍵字union的使用

從上圖可以看出,位域結合聯合使用是非常好表達的,在代碼裡能很直觀的表達我們自己的意圖。下面附上示例的完整代碼:

C語言關鍵字union的使用

我當前使用的是deepin操作系統,程序運行結果顯示為"Interrupts: 0xC0.",至於數據存儲模式大小端的知識我在專欄裡也介紹過,在此不再贅述。

順便說下,有人可能會認為在消息隊列使用時,由於發送的各個消息各不相同,同一時刻只能發送一個消息,因此可以使用聯合來節省空間,這麼一看貌似也對,的確可以如此。

C語言關鍵字union的使用

但是你想過沒有,現在的計算機不差你那點存儲空間,可以大膽的去使用結構體也是可以的。如果我使用通用指針是不是是最佳的方案呢?定義如下:

C語言關鍵字union的使用

通用指針怎麼用,有什麼妙用?我在專欄裡講解過該知識點後使用了比較多的示例去使用它,要多用多體會通用指針的妙用才好。

通過這一篇文章,希望你可以對聯合有了一個更加深刻的認識,知道什麼場景才是最適合它的。


分享到:


相關文章: