在程序调试时,我们经常需要输出一些调试信息,当调试完毕后,就不再需要使用了。那怎么快速的在调试状态和发布状态切换呢?通常我们使用预编译加宏定义来处理这个问题,例如:
#ifdef DEBUG
调试代码
#endif
如果我们使用printf来显示一些调试信息,那么每个地方都加上#ifdef和#endif就很麻烦了。我们可以定义一个DbgPrintf的函数来专门处理这些事情,只在DbgPrintf函数内放上#ifdef和#endif就行了。但是这样代码在运行时,还是有调用一次函数的,浪费了时间。那么可不可以利用宏定义,实现完全没有编译代码产生的宏呢?
可以尝试下面的宏代码:
#ifdef DEBUG
#define DbgPrintf printf
#else
#define DbgPrintf /\
/DbgPrintf
#endif
如果DEBUG已经定义了,那么不用说,当然是用printf去代替DbgPrintf了。
下面只分析DEBUG未定义的情形,这个宏定义实际上是将“DbgPrintf”定义成了“//DbgPrintf”,由于续行符的作用,#define定义时不会发现注释符“//”,但是在展开到代码之后,就成了注释符“//”了,也就是说,如果你原来的代码是DbgPrintf("%d",x);,经过这个宏展开后成了//DbgPrintf("%d",x);,相当于自动在前面加了注释符“//”。要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了。另外,这个宏只能单独一行使用,因为它将该行后面的代码都注释掉了。
主要是因为有些编译器它不支持不定长参数宏定义,而printf函数刚好又是一个不定长参数的,所以定义为空宏的办法不好搞,才想出了这个一个把宏变成“//”注释的办法。另外还可以使用
//#define DEBUG
#ifdef DEBUG
#define DBG(CODE) CODE
#else
#define DBG(CODE)
#endif
就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如
DBG(printf("%d",x);)
这样就不会出什么问题了,而且还可以在里面写很多行代码。
相关讨论:
aolin 发表于 2008-12-19 14:10 侃单片机 ←返回版面 |
楼主: Keil C51支不支持可变参数长度的宏定义? |
|
computer00 发表于 2008-12-19 15:05 侃单片机 ←返回版面 |
2楼: 变通一下: #defing myprintf printf |
|
aolin 发表于 2008-12-19 15:26 侃单片机 ←返回版面 |
3楼: 曾经跟你一样变通用过,但不可取 |
|
computer00 发表于 2008-12-19 16:20 侃单片机 ←返回版面 |
4楼: 嘿嘿,为此俺专门给你想了一个变态的用法: |
|
aolin 发表于 2008-12-19 17:41 侃单片机 ←返回版面 |
5楼: 不错,有点意思,试试看 |
|
aolin 发表于 2008-12-19 17:49 侃单片机 ←返回版面 |
6楼: 这个注意真的是高啊! |
|
computer00 发表于 2008-12-19 17:53 侃单片机 ←返回版面 |
7楼: 嘿嘿,一般人俺不告诉他... |
|
原野之狼 发表于 2008-12-19 18:34 侃单片机 ←返回版面 |
8楼: 圈圈方法不错 |
|
天马行空88 发表于 2008-12-19 20:26 侃单片机 ←返回版面 |
9楼: 不错 |
|
ayb_ice 发表于 2008-12-20 19:34 侃单片机 ←返回版面 |
10楼: 如果写成两行或多行00的方法不行 |
|
computer00 发表于 2008-12-20 20:07 侃单片机 ←返回版面 |
11楼: 是的,多行或者带返回值都麻烦,要不改一种方法: |
|
ayb_ice 发表于 2008-12-20 21:34 侃单片机 ←返回版面 |
12楼: C宏好象不能实现多行解释"/**/" |
|
computer00 发表于 2008-12-21 00:01 侃单片机 ←返回版面 |
13楼: 你想要实现什么样的功能呢? |
|
ayb_ice 发表于 2008-12-21 10:14 侃单片机 ←返回版面 |
14楼: 我想实现 |
变量声明定义在一个文件中搞定,其实大部分功能已经实现,只是带初始化的而且多行定义的不太方便 比如: int array[] = { 0, 1, 2 }; 想变成 M1 int array[] M2 = { 0, 1, 2 }; M3 其中M123是相关的宏定义,配合完成定义和声明,定义时M123=空格是没有问题, 但声明时希望 M1=extern,M2=/*,M3=*/;,而M23实现不了.目前是用每行加M4=//实现的,//这对于大型变量效率太低.
热门讲座:设计更轻松: 全新SIMPLE SWITCHER? 解决方案及设计工具
最快的电路板打样 电路板雕刻加工服务 从一块板做起 24小时交货!
|
|
computer00 发表于 2008-12-21 11:06 侃单片机 ←返回版面 |
15楼: 这个好象没办法,因为遇到第一个注释“/*”之后, |
|
ayb_ice 发表于 2008-12-21 11:10 侃单片机 ←返回版面 |
16楼: 我去试试 |
|
ayb_ice 发表于 2008-12-21 11:25 侃单片机 ←返回版面 |
17楼: 试了一下,还是不行 |
一有机会,我就想办法,两年了一直搞不定,可能是编译器不支持吧.
下面就是我的变量定义声明一次搞定的方法
/* 这种方法可以 ------------------------------- EXT U8C Example[] IV1 = IV2 { IV2 0x00,0x01,0x02,0x03 IV2 }; ------------------------------- */
/* 这种方法不可以 ------------------------------- EXT U8C Example[] IV3 = { 0x00,0x01,0x02,0x03, 0x00,0x01,0x02,0x03 };IV4 // IV3,IV4方式有问题 ------------------------------- */
热门讲座:设计更轻松: 全新SIMPLE SWITCHER? 解决方案及设计工具
最快的电路板打样 电路板雕刻加工服务 从一块板做起 24小时交货!
|
|
computer00 发表于 2008-12-21 12:51 侃单片机 ←返回版面 |
18楼: 不会吧...我这个在keil、VC下试了,都可以正常使用呀... |
|
ayb_ice 发表于 2008-12-21 13:17 侃单片机 ←返回版面 |
19楼: 不好意思 |
|
ayb_ice 发表于 2008-12-21 18:48 侃单片机 ←返回版面 |
20楼: 解决LZ的问题不用变态方法 |
#define M1(a,b) a##b #ifdef _DEBUG #define myprintf printf #else #define myprintf M1(/,/) #endif 当然不要分两或多行写
|
|
用户292630 2013-3-13 20:09
用户124183 2009-7-4 12:05
用户1156376 2009-7-1 21:34
用户1156376 2009-7-1 21:33
用户1404148 2009-2-19 09:55
computer00 2009-2-10 14:28
用户110626 2009-2-9 17:12
用户470955 2009-1-21 17:35
computer00 2009-1-21 11:24
用户1196490 2009-1-20 11:00