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


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

    1 定义枚举类型

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

    1)方式一(不使用typedef):
    a.显式指定定义值
    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
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    b.隐式推断定义值
    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
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    方式二(使用typedef)
    a.显式指定定义值
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    b.隐式推断定义值
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    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的枚举类型的变量,其变量名为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);
    	} 
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    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的枚举类型的变量,其变量名为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);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    3 使用枚举的注意事项
    1)枚举数据类型不使用typedef声明时

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    MATLAB——一维连续小波的分解
    最新AI系统ChatGPT源码+AI绘画系统源码+支持GPT4.0+Midjourney绘画+搭建部署教程+附源码
    【封装UI组件库系列】全局样式的定义与重置
    游戏创业小知识:游戏运营的步骤和流程
    【设计模式】组合模式(Composite Pattern)
    binder hwbinder vndbinder
    玩转ASP.NET 6.0框架-序言
    【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
    Nanoprobes Mono- Sulfo -NHS-Nanogold的使用和应用
    【剑指 Offer 27. 二叉树的镜像】
  • 原文地址:https://blog.csdn.net/fancyang/article/details/137871067