大家好,我是无际。
今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作。
我跟你保证,今天的内容绝对是你在书本和视频学不到的。
为什么要讲枚举呢?
因为我发现它是一个容易被遗忘,同时又非常重要的关键词,大家如果看那些大佬写的程序,真的会发现有非常非常多enum的应用。
让我惊奇的是市面上的一些C语言书籍以及视频课程并没有重视去讲enum。
今天我们还是从理论到实际产品应用,教大家真正掌握enum。
通过这篇内容你能掌握以下知识:
掌握枚举的相关概念掌握枚举的几种用法掌握枚举在实际产品中的应用
这篇内容是无际单片机编程那个程序架构视频教程的讲课稿,我稍微做了些调整,如果想看视频的也可以找我们拿。
一、枚举的概念
我对枚举的理解是把一些固定的值一一列举出来分别起个名字,比如说给1取个名字叫Ture, 0取个名字叫False。
Ture和false都是一种表示同一个类型的数据,比如说都是代表逻辑的对错。
我们模拟51单片机的IE中断使能寄存器每个位的值来举一个例子。
我们可以对照单片机寄存器芯片资料一下,当我们设置IE寄存器的值等于0x01的时候,代表开启外部中断0,设置成0x80的时候允许全部中断。
这些枚举值都是针对寄存器IE的固定值,所以我们可以称这些值是同一个类型的数据,我们把他们重新命名一下,便于阅读和记忆,这就是枚举的重要作用之一。
二、枚举的几种用法
1.直接定义枚举值,然后给普通变量赋值。
上面这个代码呢,定义了一个枚举类型,但是没有给枚举类型命名。
像这种枚举呢就是没办法定义枚举变量的,但是呢,这样其实也是可以用的。
我们通过定义一个普通变量,然后把枚举的值赋给他,一样也能输出正确的值,这种方法我个人经常偷懒地用。
2.定义带名称的枚举
这里定义了一个名字为WeekDay的枚举,那么我们就可以通过这个枚举类型定义一个名为day的枚举变量。
三、定义枚举别名
这个代码中通过typedef来定义枚举的别名为WeekDay,然后我们直接使用WeekDay day来定义一个enum变量,这种方法用的是最多的。
四、枚举有什么用,用在哪里?
上面我们已经学习了枚举的一些定义方法,那么枚举到底在产品当中有什么用呢?
枚举的作用:
1.为固定的值命名,当作数组访问的下标,当固定的数据很多时,比如有几十上百个,那么如果你应0-100去表示就很难记住每个值代表什么意思。
比如说之前做过汽车故障诊断的产品,需要读取Pid数据存储到数组里,而PID有将近100个。
如果让你去记这100个每个代表哪个PID参数,估计你会崩溃。
而我把每个PID参数通过枚举另起一个一看就知道是什么参数的名字,是不是就方便很多?
因为每个PID都单独存储在数组的一个元素里,那我用这个名字作为下标能很快速地把指定PID参数从数组取出来。
看上图用枚举和不用枚举读取的区别相信你就能理解了。
2.可以作为一个变量,灵活分配数组大小。
我们在定义数组的时候,直接用该枚举类型的最后一个值作为数组大小。
下次要增加或者减少PID参数的时候就不用去改数组大小了,非常方便。
3.枚举作为设置值
上图是STM32的固件库代码,配置GPIO模式的枚举定义。
我们可以看到,每一个枚举值都代表着一个模式,最后通过把这些值写入相应寄存器,最终完成GPIO的模式配置。
这里就先说这么多,更多实战应用可以跟随无际单片机编程做项目去学习和提高。
最后总结:
不知道大家有没有发现,其实枚举配合结构体,C语言照样也能做面向对象的编程。
面向对象是什么意思?就是一切皆对象,单片机GPIO是一个对象,定时器是一个对象,串口又是一个对象等等。
每个对象都有自己独有的属性,比如说GPIO有输入和输出的模式,有输出的频率,有输出的引脚号,这些都是属于GPIO的属性。
那我们可以通过枚举和结构体把这些属性封装起来,当做一个对象来处理。
如果大家理解比较困难也没关系,这都是正常的。
当你代码写到一定量的时候,慢慢就理解了。