单片机/MCU论坛
直播中

24不可说

9年用户 7954经验值
擅长:电源/新能源
私信 关注
[文章]

枚举变量与宏的应用

转自EEW。


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

回帖(3)

王栋春

2018-2-26 17:05:19
学习了解一下    高等数学
举报

24不可说

2018-2-26 21:51:32
引用: 王栋春 发表于 2018-2-26 17:05
学习了解一下    高等数学

这是C语言,高数主要讲微积分的
举报

王友让

2018-2-26 22:22:45
路过看看。      
举报

更多回帖

发帖
×
20
完善资料,
赚取积分