5366|7

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

枚举变量与宏的应用 [复制链接]

本帖最后由 zhaojun_xf 于 2015-4-17 11:43 编辑

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

此帖出自stm32/stm8论坛

最新回复

一不小心就容易掉进去  详情 回复 发表于 2017-4-9 16:11
点赞 关注(1)
个人签名我的博客
 

回复
举报

7671

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 
你这就是关公站秦琼
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
其实这个话题很好,枚举类型很简单就是一个结构,好理解.
宏这块儿特别复杂,能实现恨复杂的功能,比如定时器f初值,网上看到有定时器计算器就觉得很搞,宏完全可以自己算而不增加执行开销.
很多功能我也说不清楚,比如下划线_和__和#和##和\续航符的作用,我知道##是字符连接,续航符将多行合并成一行,_符号好像可以执行可变参数的替换,期待更具体的讲解ing.
此帖出自stm32/stm8论坛
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

4
 
学习啦
此帖出自stm32/stm8论坛
 
个人签名最近研究STM32,会对库函数的源代码进行解读,会陆续更新
 
 

回复

21

帖子

1

TA的资源

一粒金砂(中级)

5
 
#define DEBUG(data) printf( "parameter"#n" = %d\n ", data)
除了一个#还有##的用处,用得比较少但却实好用。
此帖出自stm32/stm8论坛
 
 
 

回复

458

帖子

1

TA的资源

一粒金砂(高级)

6
 
好资源,好楼主,学习学习,真心希望电子工程世界这个论坛越来越好,希望大家都能来支持楼主
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
学习了
此帖出自stm32/stm8论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(初级)

8
 
一不小心就容易掉进去
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表