c语言枚举类型enum用法及应用

c语言枚举类型enum用法及应用大家好 我是无际 今天跟大家讲一下我在产品开发时 用枚举 enum 的一些骚操作 我跟你保证 今天的内容绝对是你在书本和视频学不到的 为什么要讲枚举呢 因为我发现它是一个容易被遗忘 同时又非常重要的关键词 大家如果看那些大佬写的程序 真的会发现有非常非常多 enum 的应用 让我惊奇的是市面上的一些 C 语言书籍以及视频课程并没有重视去讲 enum 今天我们还是从理论到实际产品应用 教大家真正掌握 enum 通过这篇内容你能掌握以下知识 掌握枚举的相关概念 掌握枚举的几种用法 掌握枚

大家好,我是无际。

今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作。

我跟你保证,今天的内容绝对是你在书本和视频学不到的。

为什么要讲枚举呢?

因为我发现它是一个容易被遗忘,同时又非常重要的关键词,大家如果看那些大佬写的程序,真的会发现有非常非常多enum的应用。

让我惊奇的是市面上的一些C语言书籍以及视频课程并没有重视去讲enum。

今天我们还是从理论到实际产品应用,教大家真正掌握enum。

通过这篇内容你能掌握以下知识:

  1. 掌握枚举的相关概念
  2. 掌握枚举的几种用法
  3. 掌握枚举在实际产品中的应用

这篇内容是无际单片机编程那个程序架构视频教程的讲课稿,我稍微做了些调整,如果想看视频的也可以找我们拿。

一、枚举的概念

我对枚举的理解是把一些固定的值一一列举出来分别起个名字,比如说给1取个名字叫Ture, 0取个名字叫False。

Ture和false都是一种表示同一个类型的数据,比如说都是代表逻辑的对错。

我们模拟51单片机的IE中断使能寄存器每个位的值来举一个例子。

c语言枚举类型enum用法及应用

我们可以对照单片机寄存器芯片资料一下,当我们设置IE寄存器的值等于0x01的时候,代表开启外部中断0,设置成0x80的时候允许全部中断。

c语言枚举类型enum用法及应用

这些枚举值都是针对寄存器IE的固定值,所以我们可以称这些值是同一个类型的数据,我们把他们重新命名一下,便于阅读和记忆,这就是枚举的重要作用之一。

二、枚举的几种用法

1.直接定义枚举值,然后给普通变量赋值。

c语言枚举类型enum用法及应用

上面这个代码呢,定义了一个枚举类型,但是没有给枚举类型命名。

像这种枚举呢就是没办法定义枚举变量的,但是呢,这样其实也是可以用的。

我们通过定义一个普通变量,然后把枚举的值赋给他,一样也能输出正确的值,这种方法我个人经常偷懒地用。

2.定义带名称的枚举

c语言枚举类型enum用法及应用

这里定义了一个名字为WeekDay的枚举,那么我们就可以通过这个枚举类型定义一个名为day的枚举变量。

三、定义枚举别名

这个代码中通过typedef来定义枚举的别名为WeekDay,然后我们直接使用WeekDay day来定义一个enum变量,这种方法用的是最多的

c语言枚举类型enum用法及应用

四、枚举有什么用,用在哪里?

上面我们已经学习了枚举的一些定义方法,那么枚举到底在产品当中有什么用呢?

枚举的作用:

1.为固定的值命名,当作数组访问的下标,当固定的数据很多时,比如有几十上百个,那么如果你应0-100去表示就很难记住每个值代表什么意思。

c语言枚举类型enum用法及应用

比如说之前做过汽车故障诊断的产品,需要读取Pid数据存储到数组里,而PID有将近100个。

如果让你去记这100个每个代表哪个PID参数,估计你会崩溃。

而我把每个PID参数通过枚举另起一个一看就知道是什么参数的名字,是不是就方便很多?

因为每个PID都单独存储在数组的一个元素里,那我用这个名字作为下标能很快速地把指定PID参数从数组取出来。

c语言枚举类型enum用法及应用

看上图用枚举和不用枚举读取的区别相信你就能理解了。

2.可以作为一个变量,灵活分配数组大小。

c语言枚举类型enum用法及应用

c语言枚举类型enum用法及应用

我们在定义数组的时候,直接用该枚举类型的最后一个值作为数组大小。

下次要增加或者减少PID参数的时候就不用去改数组大小了,非常方便。

3.枚举作为设置值

c语言枚举类型enum用法及应用

上图是STM32的固件库代码,配置GPIO模式的枚举定义。

我们可以看到,每一个枚举值都代表着一个模式,最后通过把这些值写入相应寄存器,最终完成GPIO的模式配置。

这里就先说这么多,更多实战应用可以跟随无际单片机编程做项目去学习和提高。

最后总结:

不知道大家有没有发现,其实枚举配合结构体,C语言照样也能做面向对象的编程。

面向对象是什么意思?就是一切皆对象,单片机GPIO是一个对象,定时器是一个对象,串口又是一个对象等等。

每个对象都有自己独有的属性,比如说GPIO有输入和输出的模式,有输出的频率,有输出的引脚号,这些都是属于GPIO的属性。

那我们可以通过枚举和结构体把这些属性封装起来,当做一个对象来处理。

如果大家理解比较困难也没关系,这都是正常的。

当你代码写到一定量的时候,慢慢就理解了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/204384.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午8:25
下一篇 2026年3月19日 下午8:25


相关推荐

  • Java设计模式之责任链模式、职责链模式「建议收藏」

    继续介绍23种设计模式系列,本文介绍的是职责链模式。

    2022年3月11日
    39
  • html字体属性控制,水平线,上下标,插入图片

    html字体属性控制,水平线,上下标,插入图片

    2021年9月9日
    88
  • python 请在微信客户端打开_(未解决)jmeter报错之“请在微信客户端打开链接”

    python 请在微信客户端打开_(未解决)jmeter报错之“请在微信客户端打开链接”这是一个还没解决的问题,这里纯粹记录自己思考的过程,后续给自己参考。先说明情景:对微信公众号的一个接口进行调用跑通,后续可能需要压测(是的,仅仅是调通一个接口而已o(╥﹏╥)o)1、按照我理解的正常套路,我直接请求对应的接口,然后通过抓包得到Cookie,写入到HTTPCookie管理器中,如下:emmmm….开始百度,发现也有类似的提问,但是没有一个靠谱有效的答案。然后我就去分析登录过程了…

    2022年5月2日
    50
  • 【原创】通过 ioctl + FIONREAD 判定数据可读「建议收藏」

    【原创】通过 ioctl + FIONREAD 判定数据可读「建议收藏」【原创】通过ioctl+FIONREAD判定数据可读摩云飞 2016-05-1209:57:51 浏览470 评论0libevent ioctl FIONREAD摘要: 在排查业务bug的过程中,看到如下两种输出信息: TCP连接正常情况下,进行数据读取 14:00:38epoll_ctl(26,EPOLL_CTL_MOD,31,{EPOLLIN

    2022年7月23日
    17
  • robots.txt文件详解「建议收藏」

    robots.txt文件详解「建议收藏」原文地址:robots.txt-禁止爬虫Robots.txt-禁止爬虫robots.txt用于禁止网络爬虫访问网站指定目录。robots.txt的格式采用面向行的语法:空行、注释行(以#打头)、规则行。规则行的格式为:Field:value。常见的规则行:User-Agent、Disallow、Allow行。User-Agent行User-Agent:r

    2022年5月6日
    85
  • Singleton单例模式

    Singleton单例模式Singleton 是对全局变量的取代策略作用 保证一个类只能有一个实例 并提供一个全局唯一的访问点 仅有一个实例 通过类的静态成员变量来体现 提供访问它的全局访问点 访问静态成员变量的静态成员函数来体现 设计模式 一书中给出了一种很不错的实现 定义一个单例类 使用类的私有静态指针变量指向类的唯一实例 并用一个公有的静态方法获取该实例 单例模式通过类本身来管理其唯一实例 这种特性提供了解决问题的方法 唯一的实例是类的一个普通对象 但设计这个类时 让它只能创建一个实例并提供对此实例的全局访问

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号