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授权并查看二进制文件名称和位…

UnixLinux技术文章目录(2015-12-22更新)

Unix & Linux 方面的博客整理、归纳分类,要坚持不懈的学习Unix &Linux,加油!技术需要累积和沉淀.更需要锲而不舍的精神、持之以恒的毅力!借此下面名句勉励自己! 书上有路勤为径,学海无涯苦作舟&…

c mysql 创建存储过程_[转]MYSQL 创建存储过程

MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂…

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

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

marquee 移动属性

该标签不是HTML3.2的一部分&#xff0c;并且只支持MSIE3以后内核&#xff0c;所以如果你使用非IE内核浏览器(如&#xff1a;Netscape)可能无法看到下面一些很有意思的效果该标签是个容器标签语法&#xff1a;<marquee></marquee>以下是一个最简单的例子&#xff1a…

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

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

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

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

mysql数据库重启命令_MySQL数据库之windows下重启mysql的方法

本文主要向大家介绍了MySQL数据库之windows下重启mysql的方法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。其中第二种方法对我这无效&#xff0c;以后再搞清楚&#xff01;一、MYSQL服务我的电脑——(右键)管理——服务与应用程序—…

例子:Basic Lens sample

本例演示了如何自己扩展一个Camera Lens。 1. UI界面是一个MediaViewer <controls:MediaViewerx:Name"MediaViewer"Items"{Binding CameraRoll}" FooterVisibility"Visible"FooterDisplayed"MediaViewer_FooterDisplayed"ItemDispl…

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

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

不是每个人都可以坚持!

三个月的暑假&#xff0c;准确来说休息了1个月。 从7月25日开始&#xff0c;就开始了人生第一份工作&#xff0c;或者说是实习。单位是上海XXX&#xff0c;一家国企。 刚进单位的时候&#xff0c;老大给我的任务&#xff0c;是很简单的三个字做报表。本来以为很简单&#xff0c…

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

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

ios 在UIView上画图,线条

1.画线条&#xff08;实线&#xff0c;虚线&#xff09; - (void)drawRect:(CGRect)rect { CGContextRef context UIGraphicsGetCurrentContext(); [self drawXLine:context rect:rect]; [self drawLegend:context rect:rect]; } -(CGContextRef)drawXLine:(CGContextRef)cont…

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

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

linux/unix下setuid/seteuid/setreuid/setresuid

其中setresuid()具有最清晰的语法&#xff1a; setresuid()被执行的条件有&#xff1a; ①当前进程的euid是root ②三个参数&#xff0c;每一个等于原来某个id中的一个 如果满足以上条件的任意一个&#xff0c;setresuid()都可以正常调用&#xff0c;并执行&#xff0c;将 进程…

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

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

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

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

删除 索引 外键 mysql_MySQL外键及级联删除 表的存储引擎与创建索引 删除数据库和表...

Messages表&#xff1a;mysql>create table Messages(->message_id int auto_increment primary key,->user_name varchar(50) not null,->author_id int not null,->body text,->forum_id int not null);Forums表&#xff1a;mysql>create table Forums(…