枚举变量与宏的应用

想必会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。只有代码编译完成后,编译器才会为枚举变量分配空间和赋值。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180225G057XA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券