struct里面有union_联合体union无可替代的使用

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

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

63bac1952611fde65c1b9339d92681b2.png

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

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

c324b39e2060f579b49beff5cecc3bb1.png

使用如下:

0386d88625a9ada86bca500a72027a92.png

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

bd597f0c0b0a405da1b8a7d8c60b5f96.png

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

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

5582b567c2a7b1ccf3d3ebabc4e31886.png

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

8aa69b09668344e4036d78697c34bb3d.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]字符串匹配那些事

本系列文章主要介绍几种常用的字符串比较算法,包括但不限于蛮力匹配算法,KMP算法,BM算法,Horspool算法,Sunday算法,fastsearch算法,KR算法等等。 本文主要介绍KMP算法和BM算法,它们分…

查看kafka的主从状态_Mysql 主从复制,mysql-proxy读写分离

准备两台mysql服务器,master(192.168.43.64)、slave(192.168.84.129)master配置:log-binmysql-bin binlog_formatmixed server_id1 binlog_checksumnoneslave配置:然后给master授权并查看二进制文件名称和位…

14个支持响应式设计的流行前端开发框架

在几年前,并没有真正意义上的前端开发。随着网络技术的发展,网站和 Web 应用程序变得越来越复杂,前端部分的工作独立出来逐渐成为现在的前端开发。如今,我们可以看到越来越多的公司在招聘前端开发岗位。 前端开发并不容易&#xf…

重写方法返回值可以不一样吗_MAX和MIN函数你会用吗?不一样的应用方法

​一看到标题,大家可能会想,MAX和MIN函数谁不会,不就是求最大和最小嘛,今天就给大家介绍点MAX和MIN函数不一样的内容。首先还是先看下它的定义:MAX:返回一组值中的最大值MIN:返回一组值中的最小…

(转载)最黑的黑客米特尼克:多次耍FBI 终被高手擒

(转载)http://bbs.chinabyte.com/thread-816847-1-1.html凯文米特尼克 50岁 第一个被FBI通缉的黑客,被称为“头号电脑骇客”,曾入侵北美防空指挥系统,现职业是网络安全咨询师。 阿德里安拉莫 入侵《纽约时报》、微软,被…

mysql中的生日应该是什么类型_MySQL中的数据类型和schema优化

最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。1. 选择优化的数据类型MySQL支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助确定数据类型:更小的通常更好应尽可能…

vsftpd pam_mysql crypt 1_安装vsftpd+pam+mysql实现对虚拟用户身份认证详细步骤

安装vsftpdpammysql实现对虚拟用户身份认证详细步骤发布时间:2020-05-13 11:42:57来源:亿速云阅读:188作者:三月栏目:数据库下文主要给大家带来安装vsftpdpammysql实现对虚拟用户身份认证详细步骤,希望这些…

校园卡系统mysql与java结合_基于Java+JSP+Mysq+Servletl的校园卡一卡通管理系统

需求分析使用JavaJSPMysqServlet技术实现一个校园卡一卡通管理系统, 分为学生与管理员两个角色, 能够进行登录, 充值, 挂失, 历史消费查询等功能本站提供其他类型的 一卡通管理系统源代码 点击查看运行环境java, jdk1.8,tomcat8.5,mysql5.6, EclispseEE/Idea项目技术java, JSP,…

shell监控mysql发邮件_用shell脚本监控linux系统 自动发送邮件

此脚本可以做一个定时的检测,超出设定的值,即往邮箱发送警告脚本用到bc,sendmail,163邮箱,yum install bc#!/bin/bash#System Monitoring Scriptwhile [ 1 ]do#本机需开启postfix或sendmail服务。#报警邮件地址设置MAI…

【C语言】01-C语言概述

说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略 回到顶部为什么iOS开发要先学C语言? i…

Java IO 体系结构

参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

java wap_JAVA和WAP移动学习技术

JAVA和WAP移动学习技术JAVA/WAP移动学习技术摘 要 移动学习是今后课堂学习的必要补充,WAP技术是基于连接浏览的移动学习关键技术。本文以移动电话学生成绩查询系统为例,利用UML模型表征实现的过程,分析其运用的WML 、SERVLET与连接池等技术。…

NuGet学习笔记(1)——初识NuGet及快速安装使用

关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录。 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package Manager,右键项目文件多了一项Manage Nuget Packages...&#xff0c…

ZOJ 2562 More Divisors

又是个水题,刚刚开始没有用搜索,因为对于反素数有: n2^t1*3^t2^5^t3*7^t4..... 这里有 t1>t2>t3>t4。 而且相同的因数的情况下,素数越不同越好。 哪知道这个方法错了! 。 看来还得中规中矩得用dfs。 我觉得还…

java for 和foreach_关于java中for和foreach循环

for循环中的循环条件中的变量只求一次值!具体看最后的图片foreach语句是java5新增,在遍历数组、集合的时候,foreach拥有不错的性能。foreach是for语句的简化,但是foreach并不能替代for循环。可以这么说,任何foreach都能…

将datatable导出为excel的三种方式(转)

一、使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下: 2 publicstaticboolExportExcel(System.Data.DataTable dt, stringpath)3 {4 boolsucceed false;5 if(dt !null)6 {7 Microsoft.Office.Interop.Excel.Application xlApp null;8 try9 {10 xl…

bae java上传图片_干货分享:gradle+svn轻松搞定BAE java代码上传

背景在BAE基础版和专业版上,java应用通过war包文件部署的时候,总会遇到一些小麻烦:BAE专业版的svn/git有单文件40M的限制,所以在专业版的svn/git中上传超过40M的war包(很多war包都会超过40M)是不可行的BAE基础版的svn/git&#xf…