单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.12枚举

2024-04-17 23:28

本文主要是介绍单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.12枚举,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

枚举(enumeration)是C语言的一种重要数据类型,由用户自定义一组命名的整数常量。使用枚举可以使程序具有可读性及可维护性。

1 定义枚举类型

在C语言中,使用enum关键字来定义枚举类型。下面以LED为例,介绍枚举类型的定义方法。

1)方式一(不使用typedef):
a.显式指定定义值
enum LED   					//声明一个名为LED的枚举类型
{LED_DEBUG				= 0,				//定义LED_DEBUG的枚举数据,其值为0LED_FUN                 = 1,				//定义LED_FUN的枚举数据,其值为1LED_RUN                 = 2,				//定义LED_RUN的枚举数据,其值为2LED_TEMPEATATURE        = 3,				//定义LED_TEMPEATATURE的枚举数据,其值为3LED_FAULT    	        = 4,				//定义LED_FAULT的枚举数据,其值为4LED_NUM					= 5,		 		//定义LED_NUM的枚举数据,其值为5
};
b.隐式推断定义值
enum LED					//声明一个名为LED的枚举类型			
{	LED_DEBUG				,			//定义LED_DEBUG的枚举数据,其默认值为0LED_FUN                	,			//定义LED_FUN的枚举数据,其默认值为1LED_RUN                 ,			//定义LED_RUN的枚举数据,其默认值为2LED_TEMPEATATURE        ,			//定义LED_TEMPEATATURE的枚举数据,其默认值为3LED_FAULT    	        ,			//定义LED_FAULT的枚举数据,其默认值为4LED_NUM					,			//定义LED_NUM的枚举数据,其默认值为5
};
方式二(使用typedef)
a.显式指定定义值
typedef enum				//声明一个枚举类型
{LED_DEBUG				= 0,				//定义LED_DEBUG的枚举数据,其值为0LED_FUN                 = 1,				//定义LED_FUN的枚举数据,其值为1LED_RUN                 = 2,				//定义LED_RUN的枚举数据,其值为2LED_TEMPEATATURE        = 3,				//定义LED_TEMPEATATURE的枚举数据,其值为3LED_FAULT    	        = 4,				//定义LED_FAULT的枚举数据,其值为4LED_NUM					= 5,		 		//定义LED_NUM的枚举数据,其值为5
}LED_t;						//将这个枚举类型起个别名为LED_t
b.隐式推断定义值
typedef enum				//声明一个枚举类型
{LED_DEBUG				,			//定义LED_DEBUG的枚举数据,其默认值为0LED_FUN                	,			//定义LED_FUN的枚举数据,其默认值为1LED_RUN                 ,			//定义LED_RUN的枚举数据,其默认值为2LED_TEMPEATATURE        ,			//定义LED_TEMPEATATURE的枚举数据,其默认值为3LED_FAULT    	        ,			//定义LED_FAULT的枚举数据,其默认值为4LED_NUM					,			//定义LED_NUM的枚举数据,其默认值为5
}LED_t;						//将这个枚举类型起个别名为LED_t
2 使用枚举类型
1)方式一(不使用typedef):
	
void LED_Set(enum LED led,bool value)
{switch (led){case LED_DEBUG:LED_DebugSet(value);break;default:break;}
}void LED_Run(uint32_t systick)
{enum LED led;			//定义一个声明为LED的枚举类型的变量,其变量名为ledled = LED_DEBUG;		//将led的值置为LED_DEBUG,其值为0if (systick % 1000 == 0){LED_Set(led,true);}else if (systick % 1000 == 500){LED_Set(led,false);} 
}
2)方式二(使用typedef):
void LED_Set(LED_t led,bool value)
{switch (led){case LED_DEBUG:LED_DebugSet(value);break;default:break;}
}void LED_Run(uint32_t systick)
{LED_t led;				//定义一个别名为LED_t的枚举类型的变量,其变量名为ledled = LED_DEBUG;		//将led的值置为LED_DEBUG,其值为0if (systick % 1000 == 0){LED_Set(led,true);}else if (systick % 1000 == 500){LED_Set(led,false);}
}
3 使用枚举的注意事项
1)枚举数据类型不使用typedef声明时

需在定义枚举类型变量时加入enum,如果不加,会出现 identifier “*” is undefined错误

2)枚举数据类型使用typedef声明时

不需在定义枚举类型变量时加入enum,如果加了,会出现 incomplete type is not allowed错误

3)枚举数据类型不能参与宏运算

你不能通过使用枚举类型中的数据定义来加入宏条件编译,这是因为,宏条件是预编译时确定,而枚举类型值是编译时确定。

#if LED_NUM > 0//这里需要加入的代码不会被执行#endif
4)枚举数据类型的大小

由枚举数据的最大默认值决定,sizeof(LED_t)其大小为1;

如果指定LED_NUM = (uint32_t)5;则sizeof(LED_t)其大小为多少?

如果指定LED_NUM = 0x0FFFFFFF;则sizeof(LED_t)其大小为多少?

请在评论中说出你的答案。

5)枚举数据类型的使用方式

通常和处于一起使用,便于快速取得数组元素。关于数组的使用,将在下一章节说明。

这篇关于单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.12枚举的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913156

相关文章

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据