调试代码的宏定义
来源:互联网 发布:金蝶软件版本号 编辑:程序博客网 时间:2024/06/05 09:40
在程序调试时,我们经常需要输出一些调试信息,当调试完毕后,就不再需要使用了。那怎么快速的在调试状态和发布状态切换呢?通常我们使用预编译加宏定义来处理这个问题,例如:
#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);)
这样就不会出什么问题了,而且还可以在里面写很多行代码.
linux里面通常有这样的写法:
#ifdef _DEBUG
#define DBG2 (fmt, args...) printf(fmt, ##args)
#else
#define DBG2 (fmt, args...)
#endif
#ifdef DEBUG3
#ifndef DEBUG2
#define DEBUG2
#endif
#endif
#ifdef DEBUG2
#ifndef DEBUG1
#define DEBUG1
#endif
#endif
#ifdef DEBUG1
#ifndef DEBUG0
#define DEBUG0
#endif
#endif
#ifdef DEBUG0
#ifndef DEBUG
#define DEBUG
#endif
#endif
#ifdef DEBUG
#ifndef DEBUG0
#define DEBUG0
#endif
#endif
#ifdef DEBUG3
#define debug3_print(...) printf(__VA_ARGS__)
#else
#define debug3_print(...)
#endif
#ifdef DEBUG2
#define debug2_print(...) printf(__VA_ARGS__)
#else
#define debug2_print(...)
#endif
#ifdef DEBUG1
#define debug1_print(...) printf(__VA_ARGS__)
#else
#define debug1_print(...)
#endif
#ifdef DEBUG0
#define debug0_print(...) printf(__VA_ARGS__)
#else
#define debug0_print(...)
#endif
#ifdef DEBUG
#define debug_print(...) printf(__VA_ARGS__)
#else
#define debug_print(...)
#endif
#endif
- 调试代码的宏定义
- 调试代码的宏定义
- ******************** 宏定义的调试 ********************
- 调试信息的宏定义
- 调试信息的宏定义 .
- C语言中宏定义的一个调试用法,巧用宏定义来调试,调试技巧
- C语言中宏定义的一个调试用法,巧用宏定义来调试,调试技巧
- 一段宏定义的代码
- gdb调试宏定义并显示宏定义的值
- windows下的调试宏定义
- 关于DEBUG调试用的宏定义
- GDB调试技巧:调试复杂的宏定义
- GDB调试技巧:调试复杂的宏定义
- 调试复杂的宏定义--GDB调试技巧
- GDB调试技巧:调试复杂的宏定义
- GDB调试技巧:调试复杂的宏定义
- 调试宏定义
- ios 宏定义调试
- 一个程序员超牛的JAVA独立毕业设计截图[附源码+jar包]
- Oracle左连接,右连接
- .ftl文件 是什么文件
- rbac权限分析文档
- Tomcat5优化
- 调试代码的宏定义
- 管理的学问
- 解决fedora 16 "sudo"不能用
- 我力尽筋疲的努力了,但是还是无济于事。
- Android重新安装以及出现的一些问题和解决方案
- JAVA自定义标签教程及实例代码
- moss url部分参数的意思
- 使用 Apache Lucene 搜索文本
- AVR串口 自定义printf