枚举定义
关键字:enum
用途:定义一个取值受限制的整型变量,用于限制变量取值范围;宏定义的集合
定义枚举变量:
enum{FALSE = 0, TRUE = 1} EnumName;
因为枚举变量类型较长,所以通常用typedef更改变量类型名
引用枚举成员:
EnumName = FALSE;
EnumName = TRUE;
枚举应用
原文链接:https://blog.csdn.net/yetaodiao/article/details/127372017
enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,
我们可以将枚举理解为编译阶段的宏,使用格式:
enum typeName{ valueName1, valueName2, valueName3, ...... };
是枚举类型的名字,花括号里面的元素(枚举成员)是常量而不是变量,这个一定要搞清楚,因为枚举成员的是常量,所以不能对它们赋值,只能将它们的值赋给其他的变量
当枚举类型和枚举变量放在一起定义时,枚举类型的名字(就是enum week中的week)可以省略不写,意思是上图的有两种写法
第一种:
enum week{Mon=1, Tues, Wed, Thurs}num;
第二种:
enum {Mon=1, Tues, Wed, Thurs}num;
这一点其实和结构体中的无名结构很相似,虽然定义枚举类型变量和定义结构类型变量看起来很相似,但是两者的区别还是蛮大的,一个结构体类型变量里面包含若干个成员,相当于一个打包好的快递盒子,
而枚举类型变量就不一样了,枚举类型变量不是一个包含若干个成员的集合,枚举类型变量和int、char类型的变量其实差不多,只不过枚举类型变量的赋值只能用自身的枚举成员来赋值,以上面的例子来说,
num的赋值就只能用枚举成员Mon、Tues、Wed、Thurs,而不能用其他枚举类型的枚举成员来赋值
定义枚举变量和定义结构体变量相同,有两种定义方法
第一种:(定义枚举类型的同时定义枚举变量)
enum week{Mon=1, Tues, Wed, Thurs}num;
第二种:(先定义枚举类型,再定义枚举变量)
enum week{Mon=1, Tues, Wed, Thurs};
enum week num;
下面将用不同的示例来说明枚举类型的特点
示例一:(不显式说明枚举常量的值)
enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1,所以Mon=0,Tues=1,・・・・Sun=6,下面来验证一下
enum week{Mon, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d
Tues=%d
Wed=%d
Thurs=%d
Fri=%d
Sat=%d
Sun=%d
", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
————————————————
版权声明:本文为CSDN博主「叶涛网站推广优化」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
示例二:(显示说明部分枚举常量的值)
enum week{Mon=1, Tues, Wed, Thurs, Fri, Sat, Sun};
上面的代码中,只显式说明了枚举常量Mon的值为1,未指定的枚举名的值将依着最后一个指定值向后依次递增(注意是最后一个指定值)
enum week{Mon=1, Tues, Wed, Thurs, Fri, Sat, Sun};
printf("Mon=%d
Tues=%d
Wed=%d
Thurs=%d
Fri=%d
Sat=%d
Sun=%d
", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
对上面的代码稍加修改
enum week{Mon=1, Tues, Wed, Thurs, Fri=10, Sat, Sun};
printf("Mon=%d
Tues=%d
Wed=%d
Thurs=%d
Fri=%d
Sat=%d
Sun=%d
", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
运行结果:
示例三:(对枚举变量进行赋值)
enum week{Mon=1, Tues, Wed, Thurs}num;
num =(enum week)10;
printf(“%d”, num);
一个整数不能给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值,上面的代码中,在对枚举变量赋值10的时候进行的强制类型转换,将整型常量10转换成了enum week类型再赋值给num变量,
运行结果:
总结:
1、在没有显示说明的情况下,枚举常量(也就是花括号中的常量名)默认第一个枚举常量的值为0,往后每个枚举常量依次递增1
2、在部分显示说明的情况下,未指定的枚举名的值将依着之前最有一个指定值向后依次递增
3、一个整数不能给一个枚举变量,必须用该枚举变量所属的枚举类型进行类型强制转换后才能赋值
4、同一枚举类型中不同的枚举成员可以具有相同的值
5、同一个程序中不能定义同名的枚类型,不同的枚举类型中也不能存在同名的枚举成员(枚举常量)
typedef enum week my;
或者
typedef enum week{Mon=1, Tues, Wed, Thurs}my;
上面typedef也可以省略week
typedef enum{Mon=1, Tues, Wed, Thurs}my;
上面两种形式中,my都是enum week的别名(意思是my和enum week等价),需要注意的是如果将第二句的typedef去掉那么my就变成了enum week类型的变量,如果加上typedef那么my就是enum的别名,这点要注意区分
在定义了enum week的别名my后,后面就可以使用my来定义枚举类型变量
my num;
num =(enum week)10;
printf(“%d”, num);
枚举函数
enum eMovePriorityLevel {
eMovePriorityLevel_cant_move_unknown,
eMovePriorityLevel_cant_move_by_win, ///< 不能移动-已经胜利
eMovePriorityLevel_wall, ///< 不能移动-遇到了墙
eMovePriorityLevel_cant_move_by_go_twice, ///< 不能移动-已经走了2次
eMovePriorityLevel_can_move_by_go_once, ///< 可以移动-已经走了一次
eMovePriorityLevel_can_move_by_door, ///< 可以移动-是门, 从来没走过
};
使用枚举值类型的函数定义
enum eMovePriorityLevel GetMovePriorityLevel(char cPos)
使用枚举值类型的函数实现
enum eMovePriorityLevel GetMovePriorityLevel(char cPos)
{
enum eMovePriorityLevel Level;
switch (cPos)
{
case CHAR_WALL:
Level = eMovePriorityLevel_wall;
break;
case CHAR_DOOR:
Level = eMovePriorityLevel_can_move_by_door;
break;
case CHAR_EXIT:
Level = eMovePriorityLevel_cant_
枚举函数2
enum ICMDeviceType枚举类型的名字,
Icmdevtype 枚举变量
Get_SensorType()枚举函数
1、enum ICMDeviceType Icmdevtype = NOS;
2、enum ICMDeviceType
{
NOS=0, ICM20602, ICM42688, Adis16470,adis16800//枚举成员
};
3、enum ICMDeviceType Get_SensorType()
{
uint8_t whoami=0;
read_1B( MPUREG_WHO_AM_I, &whoami );//读取ID,IIC,指针,形参地址
if( whoami == 0x12 )
{
Icmdevtype = ICM20602;
}
enum ICMDeviceType Query_SensorType()
{
return Icmdevtype;
}