打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
干货 | 枚举变量与宏的应用

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PWM实现ADC采集电量原理
嵌入式软件开发没有捷径
STM32中较为常见的C语言基础知识
使用do{...}while(0u)的四大理由
STM32中常用的C语言知识点,开始复习!
#define、const、typedef的差别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服