c语言struct_C语言关键字union的使用

news/2024/7/4 23:07:31

在C语言中关键字union和struct用法是一样的,而且在项目中struct随处可见。在我的专栏"嵌入式入门——C语言入门到深入"中我详细的讲解了它们的异同。很多人编码了多年也许会认为有struct就够了,要union干嘛,感觉union的存在有些鸡肋,但是事实真的是这样吗?下面让我来告诉你哪些应用场景union是不能被struct替代的,而且使用union也是唯一能够很好的解决问题的。

我在专栏里第十五章 C语言位操作里介绍过位域这个知识点,里面我也书写了个非常经典的例程。经常和微控制芯片(MCU)打交道的嵌入式工程师对位操作一定不陌生,也经常接触各类的中断(中断是指在程序运行的过程中,出现一些"异常"情况,需要MCU干预并转入中断处理情况,处理完后重新运行原程序的过程。计算机的运行就是靠中断来维持的,键盘中断,鼠标中断,屏幕显示中断,扬声器中断等等)。现在我使用联合和位域相结合的办法可以很好的表示它们。比如我定义如下联合体:

4c89e9c052a8d644762220c4648c08b0.png

当我们要去使用各个中断的时候,直接使用uint8_t类型的数据很不直观,但是使用里面的位域却可以很好的表达。此时只能使用联合体而不能使用结构体。

现在让我们来看看怎么使用它。我先定义两个开关中断的宏,定义如下:

da4c53029aa983484bc8c536668b038d.png

使用如下:

1c93ca88e338f5def4194c3f0c03488f.png

从上图可以看出,位域结合联合使用是非常好表达的,在代码里能很直观的表达我们自己的意图。下面附上示例的完整代码:

c928613e60b2befc62100d9b72073972.png

我当前使用的是deepin操作系统,程序运行结果显示为"Interrupts: 0xC0.",至于数据存储模式大小端的知识我在专栏里也介绍过,在此不再赘述。

顺便说下,有人可能会认为在消息队列使用时,由于发送的各个消息各不相同,同一时刻只能发送一个消息,因此可以使用联合来节省空间,这么一看貌似也对,的确可以如此。

8cc8dffc7e7442b2e404c840ed685fd2.png

但是你想过没有,现在的计算机不差你那点存储空间,可以大胆的去使用结构体也是可以的。如果我使用通用指针是不是是最佳的方案呢?定义如下:

e7bd3495bf8accff53fdd5461c11722c.png

通用指针怎么用,有什么妙用?我在专栏里讲解过该知识点后使用了比较多的示例去使用它,要多用多体会通用指针的妙用才好。

通过这一篇文章,希望你可以对联合有了一个更加深刻的认识,知道什么场景才是最适合它的。


http://www.niftyadmin.cn/n/2491874.html

相关文章

webstorm 和 idea编辑器

webstorm中自动编译less文件输出css为指定路径 https://www.jianshu.com/p/0eeedaa7d57e webstorm 实时调试刷新浏览器 https://www.cnblogs.com/xxx91hx/p/6554835.html 转载于:https://www.cnblogs.com/hukeer/p/8512908.html

思维导图软件调研

1、三款思维导图软件产品基本功能特点差异: 2、目标是否盈利,对比售价。 Freemind是免费软件,并非用于盈利;XMind有免费版,但功能较少,升级版价格为129美元(终身免费更新),公司通过销…

一文搞定分布式系统ID生成方案

点击上方“阿拉奇学Java”,选择“置顶或者星标” 每天早晨00点00分,与你相约!往日回顾:现在的学生太厉害了!一位同学冒着挂科的风险给大家写得 Spring Cloud 入门总结系统唯一ID是我们在设计一个系统的时候常常会遇见的问题&#…

application实现网页计数_Springboot整合Websocket实现后端向前端主动推送消息案例

在手机上相信都有来自服务器的推送消息,比如一些及时的新闻信息,这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。一、什么是websocketWebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工…

人类为什么不把永生技术放在第一位?

永生,是几千年来人类一直梦寐以求的,一些雄心勃勃的帝王甚至为此举倾国之力,可以说,一部各国帝王史,就是一部永生幻灭史。 从古埃及法老建立金字塔以期待复活永生,到秦始皇派徐福东渡求仙,不知道…

[Js-Java SE]IO流

重要的16个流: java.io.*; FileInputStream FileOutputStream FileReader FileWriter BufferedReader BufferedWriter BufferedInputStream BufferedOutputStream DataInputStream DataOutputStream ObjectInputStream ObjectOutputStream 转换流(字节流…

Java 处理 Exception 的 9 个最佳实践,你做对了吗?

点击上方“阿拉奇学Java”,选择“置顶或者星标” 每天早晨00点00分,与你相约!往日回顾:一文搞定分布式系统ID生成方案在Java中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思…

python grpc_grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过 protobuf, 本来以为基于 protobuf 的 grpc, 上手起来会轻轻松松, 没想到结结实实的折…