1. 问题
问题来源于在看源码 #include <dirent.h>
时看到如下代码,在代码enum中为什么还需要宏定义# define DT_DIR DT_DIR
。
宏和枚举区别在哪里?
2. 宏和枚举
2.1 宏定义
c++中宏定义仅仅是在在预处理阶段进行简单的文本替换。一些常见的用法如下
#define PI 3.14159265 // 定义一个符号常量
#define SQUARE(x) ((x) * (x)) // 定义一个宏函数
// 使用宏定义
int radius = 5;
double area = PI * SQUARE(radius);
// 条件编译
#ifdef DEBUG
// 在调试模式下执行的代码
#endif
2.2 枚举
enum是一种用户自定义的数据类型。本质上来讲,不使用枚举也能完成c/c++中所有代码,只是枚举便于理解与维护。
- 增加可读性: 枚举为整数赋予了有意义的名字,从而增加了代码的可读性。代替使用数字常量,枚举允许你使用有意义的名称,使代码更容易理解。
// 使用枚举
enum Color { RED, GREEN, BLUE };
Color myColor = RED;
// 不使用枚举
int red = 0;
int green = 1;
int blue = 2;
int myColor = red;
- 类型安全: 枚举在编译时进行类型检查,这有助于避免错误的值分配。如果你尝试将一个不在枚举列表中的值分配给枚举变量,编译器会发出警告或错误。
enum Color { RED, GREEN, BLUE };
Color myColor = 42; // 编译器通常会警告或报错
2.3 区别
- #define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。
- 枚举可以自增1,这样不用每一个值都定义,而宏必须每个值都定义。
- 枚举是一个集合,代表一类值方便使用,而宏不能形成集合。
- 枚举是变量,当你声明一个枚举变量
Color s ;
时会占用空间(通常4字节)。
最后
回到文章最开始的问题,为什么要在枚举里面定义宏?经过实际测试,这里的宏定义对代码本身没有任何影响,不排除有一些类似于#ifdef DT_DIR
的用法。