枚举与宏定义的关系
枚举和宏定义是C/C++编程中常用的两种预处理方式,它们有一些相似之处,但也有一些不同。
相似之处:
- 都是在编译前进行的文本替换,用于定义常量。
- 都可以提高代码的可读性和可维护性。
不同之处:
- 声明方式不同:枚举使用关键字"enum"来声明,宏定义使用预处理指令"#define"来声明。
- 数据类型不同:枚举在编译时会被转换为整型常量,本质上是常量,所以不能对其进行赋值、取地址操作;而宏定义没有明确的数据类型。
- 可读性不同:枚举可以给常量赋予有意义的名称,提高代码的可读性;而宏定义只是简单的文本替换,不会改变可读性。
- 可维护性不同:枚举可以在需要时进行扩展,添加新的常量;而宏定义无法扩展或修改。
- 使用方式不同:枚举常用于定义一组相关的常量,例如星期几、颜色等;而宏定义常用于定义一些简单的常量或函数宏。
- 编译器处理方式不同:枚举在编译时会进行类型检查,可以发现一些常量类型错误;而宏是在预处理阶段将名字换成了值,宏定义只是简单的文本替换,不会进行类型检查。
总的来说,枚举更适用于定义一组相关的常量,提高代码的可读性和可维护性;而宏定义更适用于定义一些简单的常量或函数宏,提高代码的效率。枚举类型的这些名字不是变量,它们不会占据任何内存。且这些名字的有效范围是全局的,如果有变量等命名冲突了可能导致编译不过。
枚举常量的声明符
我们使用enum关键词来创建一个新的类型,这个类型里面包含了多个元素。
我们利用enum创建一个新的枚举类型。这里有两个注意的点,第一,每一个枚举元素后面是英文逗号’,'如果你写成了分号“;”或者中文的逗号“,”都会出现问题。第二,每次建立完枚举类型之后,都需要在大括号{}后面加一个分号“;”
enum 枚举类型名 {
常量名1 = 值1,
常量名2 = 值2,
常量名3 = 值3,
...
};
enum Weekday {
Sunday = 0,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
//在这个例子中,Sunday的值是0,Monday的值是1,依此类推
//其实不设置为默认第一个也是0开始
枚举类型 Weekday 本身占用的内存大小与里面元素的数量没有直接关系。无论枚举中定义了多少个元素,枚举类型的变量通常都会占用相同的内存大小,这个大小取决于其底层类型,通常是整型(int)。
枚举常量的赋值
默认为从0开始,第一个为0,以此类推。
自定义赋值:
enum Season {
SPRING, // 默认值为0
SUMMER=3, // 指定值为3
AUTUMN, // 值为SUMMER+1=4
WINTER // 值为AUTUMN+1=5
};
枚举常量的应用
枚举常量在嵌入式中出现比较方便。看下面图片,我们有一个IE中断运行寄存器。从最低位B0到最高位B7,有七个bit位。每一位表示进行一个操作,很明显我们难以记下来。那怎么办呢?枚举就是最好的办法
如下为枚举之后的代码。很明显,如果我们想打开寄存器中的某一个位,就不需要再去看数据手册了,直接根据这个枚举就很轻松的可以随意操作。
#include <stdio.h>
enum IE
{
EX0 = 0x01,//0000 0001
ET0 = 0x02,//0000 0010
EX1 = 0x04,//0000 0100
ET1 = 0x08,//0000 1000
ES = 0x10,//0001 0000
ET2 = 0x20,//0010 0000
Retain = 0x40,//0100 0000
EA = 0x80 //1000 0000
};
int main()
{
int Select_IE = EX0;
if (Select_IE == EX0)
{
printf("EX0\n");
}
if (Select_IE == ET0)
{
printf("ET0\n");
}
if (Select_IE == EX1)
{
printf("EX1\n");
}
return 0;
}
————————————————
参考链接:https://blog.csdn.net/qq_63922192/article/details/127324040