电脑圈圈的家当 https://passport2.21ic.com/?157621 [收藏] [复制] [RSS] 有关电子设计的一个BLOG.

日志

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

热度 2已有 3228 次阅读2008-12-19 09:44 |个人分类:玩单片机|系统分类:单片机| 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);,相当于自动在前面加了注释符“//”。要注意的是,续行符后面的“/”一定要顶格写,否则就不是“//”了。另外,这个宏只能单独一行使用,因为它将该行后面的代码都注释掉了。


路过

鸡蛋
2

鲜花

握手

雷人

刚表态过的朋友 (2 人)

发表评论 评论 (6 个评论)

lxlxdw 2008-12-20 11:20
kernel中有更好的方法. 直接把那个替换为空不是更好
回复 ybdesire 2008-12-20 13:12
圈哥什么时候出书,一直推出各种下载来掉别人胃口.........
回复 computer00 2008-12-20 16:01
主要是因为有些编译器它不支持不定长参数宏定义,而printf函数刚好又是一个不定长参数的,所以定义为空宏的办法不好搞,才想出了这个一个把宏变成“//”注释的办法。另外还可以使用 //#define DEBUG #ifdef DEBUG #define DBG(CODE) CODE #else #define DBG(CODE) #endif 就是写代码的时候,对于调试信息加上DBG,稍微麻烦点,例如 DBG(printf("%d",x);) 这样就不会出什么问题了,而且还可以在里面写很多行代码。 至于书嘛,不要急,就快拉。今天已经收到签名的书页了。出版社说了,元旦节准时出版。
回复 块块 2008-12-20 23:57
不错的变态用法:) 受用
回复 jtxr 2009-3-23 05:14
学习了!!!
回复 hollly 2010-10-18 00:48
呵呵 这样也行啊 哈