OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3542|回复: 0

DEBUG宏定义使用

[复制链接]

32

主题

223

帖子

0

精华

高级会员

Rank: 4

积分
695
金钱
695
注册时间
2015-9-23
在线时间
120 小时
发表于 2017-4-28 13:09:25 | 显示全部楼层 |阅读模式
[size=13.3333px]首先分享一个C语言中的DEBUG宏:
[size=13.3333px]//#define DEBUG // 标注1
[size=13.3333px]#ifdef DEBUG
[size=13.3333px]#define Dprintf UART1SendData   //[size=13.3333px]UART1SendData 串口发送函数
[size=13.3333px]#else
[size=13.3333px]#define Dprintf /\
[size=13.3333px]/
[size=13.3333px]#endif
[size=13.3333px]测试代码:
[size=13.3333px]while(1)
[size=13.3333px]{
[size=13.3333px]UART1SendData(0x31);
[size=13.3333px]Dprintf(0x32);
[size=13.3333px]Delay50ms();

[size=13.3333px]}

[size=13.3333px]假如说标注1位置没有注释,则测试代码串口1输出的是 0x31 0x32;
[size=13.3333px]假如说标注1位置被注释掉,则测试代码串口1输出的是0x31;


[size=13.3333px]DEBUG宏的意义:在调试的时候我们有时需要看到程序到底执行到了那里,我们会加一些串口输出放到某些程序段中,当调试完成之后再逐次的删除这些串口调试语句。有了DEBUG 需要调试的时候我们只需要用Dprintf代替UART1SendData,并且放开标注1的注释(//)。等到调试完成后加上标注1的注释(//)就可以了,不用逐一删除Dprintf。


[size=13.3333px]DEBUG 原理:
[size=13.3333px]没加注释的时候其实就是在编译器预编译的时候会将Dpritf直接替换成UART1SendData。
[size=13.3333px]加上注释的时候:这个宏定义实际上是将“DbgPrintf”定义成了“//DbgPrintf”,由于续行符的作用,#define定义时不会发现注释符“//”,但是在展开到代码之后,就成了注释符“//”了,所以加上注释之后其实代码会屏蔽该行。
[size=13.3333px]比如说上段测试代码,如果标注1有注释,那么预编译的时候编译器看到的是:
[size=13.3333px]//(0x32);
[size=13.3333px]所以该行被屏蔽掉。
[size=13.3333px]而且这一切都会在预编译时完成,并不影响代码执行速度。



[size=13.3333px]warning:
[size=13.3333px]这个宏只能单独一行使用,因为它只将该行后面的代码都注释掉了。




[size=13.3333px]欢迎大家来交流。
[size=13.3333px]加V:G-LiNing
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表