高级会员
- 积分
- 695
- 金钱
- 695
- 注册时间
- 2015-9-23
- 在线时间
- 120 小时
|
[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
|
|