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

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

1 定义枚举类型

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

1)方式一(不使用typedef):
a.显式指定定义值
c 复制代码
enum LED   					//声明一个名为LED的枚举类型
{
	LED_DEBUG				= 0,				//定义LED_DEBUG的枚举数据,其值为0
	LED_FUN                 = 1,				//定义LED_FUN的枚举数据,其值为1
	LED_RUN                 = 2,				//定义LED_RUN的枚举数据,其值为2
	LED_TEMPEATATURE        = 3,				//定义LED_TEMPEATATURE的枚举数据,其值为3
	LED_FAULT    	        = 4,				//定义LED_FAULT的枚举数据,其值为4
    LED_NUM					= 5,		 		//定义LED_NUM的枚举数据,其值为5
};
b.隐式推断定义值
c 复制代码
enum LED					//声明一个名为LED的枚举类型			
{	
	LED_DEBUG				,			//定义LED_DEBUG的枚举数据,其默认值为0
	LED_FUN                	,			//定义LED_FUN的枚举数据,其默认值为1
	LED_RUN                 ,			//定义LED_RUN的枚举数据,其默认值为2
	LED_TEMPEATATURE        ,			//定义LED_TEMPEATATURE的枚举数据,其默认值为3
	LED_FAULT    	        ,			//定义LED_FAULT的枚举数据,其默认值为4
	LED_NUM					,			//定义LED_NUM的枚举数据,其默认值为5
};
方式二(使用typedef)
a.显式指定定义值
c 复制代码
typedef enum				//声明一个枚举类型
{
	LED_DEBUG				= 0,				//定义LED_DEBUG的枚举数据,其值为0
	LED_FUN                 = 1,				//定义LED_FUN的枚举数据,其值为1
	LED_RUN                 = 2,				//定义LED_RUN的枚举数据,其值为2
	LED_TEMPEATATURE        = 3,				//定义LED_TEMPEATATURE的枚举数据,其值为3
	LED_FAULT    	        = 4,				//定义LED_FAULT的枚举数据,其值为4
    LED_NUM					= 5,		 		//定义LED_NUM的枚举数据,其值为5
}LED_t;						//将这个枚举类型起个别名为LED_t
b.隐式推断定义值
c 复制代码
typedef enum				//声明一个枚举类型
{
	LED_DEBUG				,			//定义LED_DEBUG的枚举数据,其默认值为0
	LED_FUN                	,			//定义LED_FUN的枚举数据,其默认值为1
	LED_RUN                 ,			//定义LED_RUN的枚举数据,其默认值为2
	LED_TEMPEATATURE        ,			//定义LED_TEMPEATATURE的枚举数据,其默认值为3
	LED_FAULT    	        ,			//定义LED_FAULT的枚举数据,其默认值为4
	LED_NUM					,			//定义LED_NUM的枚举数据,其默认值为5
}LED_t;						//将这个枚举类型起个别名为LED_t
2 使用枚举类型
1)方式一(不使用typedef):
c 复制代码
	
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的枚举类型的变量,其变量名为led
	
	led = LED_DEBUG;		//将led的值置为LED_DEBUG,其值为0
    
	if (systick % 1000 == 0)
	{
		LED_Set(led,true);
	}
	else if (systick % 1000 == 500)
	{
		LED_Set(led,false);
	} 
}
 
2)方式二(使用typedef):
c 复制代码
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的枚举类型的变量,其变量名为led
	
	led = LED_DEBUG;		//将led的值置为LED_DEBUG,其值为0
	
	if (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)枚举数据类型不能参与宏运算

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

c 复制代码
#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)枚举数据类型的使用方式

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

相关推荐
希和20272 小时前
江科大 51 单片机课程笔记:DS1302 实时时钟 + LCD1602 可调电子钟(小白逐行讲解)
笔记·单片机·嵌入式硬件
女神下凡2 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
shimly1234564 小时前
(done) 嵌入式硬件电路图 (11) 用 AI 看电路图与总结
嵌入式硬件
shimly1234564 小时前
(done) 嵌入式硬件电路图 (12) 学习总结与工作建议
嵌入式硬件
another heaven9 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
威嵌神州1 天前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
another heaven1 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude1 天前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
少司府1 天前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
shimly1234561 天前
(done) 嵌入式硬件电路图 (8) 获取芯片手册信息
嵌入式硬件