单片机之从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
};
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
};
方式二(使用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
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
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);
}
}
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);
}
}
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)枚举数据类型的使用方式
通常和处于一起使用,便于快速取得数组元素。关于数组的使用,将在下一章节说明。
原文地址:https://blog.csdn.net/fancyang/article/details/137871067
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!