想必会C的网友对枚举和宏的定义与使用并不陌生,对于枚举和宏的区别大家应该都很熟悉。
枚举类型用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)
在很多情况下,我们为了代码整洁,并与使用,总喜欢把多个宏定义成一个枚举变量。在代码中使用来说一般是不会出现问题的,因为他们都是常亮。但要特别注意一个问题,宏只是简单的替换,不存在与否和存储空间的问题;而枚举则是变量,是变量就会使用存储空间、且要满足变量的语法问题。
下面以一个例子来说明枚举和宏不能混用的地方:
1.定义一组枚举变量
typedef enum
{
PWM_ALT_1 = 0x00, //
PWM_ALT_2 = 0x01, //
} PWM_ALT;
2. 定义一个宏,宏的初始化值为枚举变量中的一个值
#define PWM_ALT_SLC (PWM_ALT_1) //
3. 使用这个宏进行条件编译
#if (PWM_ALT_SLC == PWM_ALT_1)
GPIOInit(GPIO0, GPIO_PIN_2, GPIO_MOD_T1_P0); (1)
#else
GPIOInit(GPIO1, GPIO_PIN_2, GPIO_MOD_T1_P0A); (2)
#endif
4. 编译运行,你会发现不管PWM_ALT_SLC取值为PWM_ALT_1还是PWM_ALT_2,编译的代码都为第(1)组,而不能得到第(2)组.这显然和我们想要的结果是不同的,为什么会这样呢?
分析:从上面的问题可以看出PWM_ALT_SLC的值为PWM_ALT_1还是PWM_ALT_2,实际上都没有发生改变,都为0.如果您不信可以直接让PWM_ALT_SLC的值为0x00或0x01,可以发现,这时候就可以正常工作了。
解决:为了获取我们想要的结果,正确的操作应该是把枚举变量用宏来代替
#define PWM_ALT_1 (0x00) //
#define PWM_ALT_2 (0x01) //
#define PWM_ALT_SLC (PWM_ALT_2) // 选择备用引脚
总结:枚举虽然说是常亮,但在编译之前编译并没有为其分配空间,也没有为其赋值。所以,默认枚举组里边的数据都为0。只有代码编译完成后,编译器才会为枚举变量分配空间和赋值。