debug宏的实现原理
(1)DEBUG宏大概的原理是:
#ifdef DEBUG
#define dbg() printf()
#else
#define dbg()
#endif
(2)工作方式是:如果我们要输出DEBUG版本则在条件编译语句前加上#define DEBUG即可,这样程序中的调试语句dbg()就会被替换成printf从而输出;如果我们要输出RELEASE版本则去掉#define DEBUG,则dbg()就会被替换成空,则程序中所有的dbg()语句直接蒸发了,这样的程序编译时就会生成没有任何调试信息的代码。
分析几个DEBUG宏
(1)应用程序中DEBUG宏
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif
注:__FILE__等是C语言中的预定义宏,就是说这个东西是个宏定义,但是是C语言自己定义的。这些宏具有特殊的含义,譬如__FILE__表示当前正在编译的c文件的文件名,…表示c语言中的可变参数。
(2)内核中的DEBUG宏
#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args...) printk(fmt, ##args)
#else
#define DEBUG(fmt, args...) do {} while (0)
#endif
简单代码展示:
#include <stdio.h>
#define DEBUG
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif
int main(void)
{
DBG("tiaoshi\n");
return 0;
}
靠DEBUG宏来条件编译控制生成哪个版本:
这里把前面的#define DEBUG去掉就变成了RELEASE。
DEBUG和RELEASE两个版本的区别:
(1)DEBUG版本就是包含了调试信息输出的版本,在程序测试过程中会发布DEBUG版本,这种版本的程序运行时会打印出来调试信息/log文件这些调试信息会帮助测试人员判断程序的问题所在,但是它占用了系统资源,拖慢了系统运行速度,所以RELEASE版本是高于DEBUG版本。RELEASE版本是最终发行版,他两的源代码一样,只是去掉了调试信息,提高了系统运行速度。