原创 【转】C语言中宏定义的一个变态用法

2008-12-24 22:00 2762 4 5 分类: 软件与OS

C语言中宏定义的一个变态用法



在程序调试时,我们经常需要输出一些调试信息,当调试完毕后,就不再需要使用了。那怎么快速的在调试状态和发布状态切换呢?通常我们使用预编译加宏定义来处理这个问题,例如:


#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);)

这样就不会出什么问题了,而且还可以在里面写很多行代码。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户177618 2009-1-14 18:15

thank you !!!!! 呵呵!
相关推荐阅读
用户179553 2010-07-16 09:16
【转】Qt/Embedded嵌入式开发环境的建立
Qt/Embedded嵌入式开发环境的建立一.             开发环境(1)       Red Hat Linux 9(2)       Linux Kernel 2.6.14(3)   ...
用户179553 2010-06-03 18:44
【转】汉字内码UNICODE转换表
Uint16 code Unicode[72][96]={/*emp*/ 0,/*啊*/21834,/*阿*/38463,/*埃*/22467,/*挨*/25384,/*哎*/21710,/*唉*/2...
用户179553 2010-05-19 18:06
【转】我的第一个WINCE驱动
早在两年前就开始做WINCE应用程序了,但是由于分工的原因,一直以来都没有机会深入了解WINCE 驱动层面的开发(包含PB相关的系统定制)。要不是前段时间马宁安排了FakeGPS开发工作,真不知道什么...
用户179553 2010-05-19 18:04
【转】我的第一个WinCE驱动--FM驱动
转做WinCE驱动已经有两个月了,却没有做过一个真正的WinCE平台下的驱动,心里都有些急了,很想尝试下,好尽快融入WinCE驱动开发这个团队。头儿也很理解,给了俺个简单的,可以说是非常简单的任务,好...
用户179553 2010-05-19 17:56
【转】WinCE流设备驱动简介及GPIO驱动的实现
流设备驱动实际上就是导出标准的流接口函数的驱动,这是文档上面的定义。在WinCE中,所有的流设备都导出流设备接口,这样WinCE中的Device Manager可以加载和管理这些流设备驱动。<?...
用户179553 2010-05-13 15:25
【转】VS2008中开发智能设备程序的一些总结收藏
结合前几日开发的《全国大坝基础数据库采集端》中的PDA程序开发过程,对VS2008开发智能设备上的程序做个小总结。1         程序结构程序中包括四个部分:1. 系统配置这个部分用来配置系统中的...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条