背景
在Linux开发中,为方便定位问题,经常需要加打印函数,在开发完毕后又需要将这些打印注释掉或干脆删除,很麻烦。
如果能引入debug/release配置
,并在debug配置下启用打印,在release配置下关闭打印,就很方便
思路
-
debug/release配置管理通过
条件编译
实现,条件判断某个宏是否定义,gcc的-D
选项可以在命令行实时添加宏定义。 -
打印的“执行or不执行” 通过
宏函数
的“定义成print语句or定义成空宏
” 来实现。
解决
用一段c代码来演示,util.c:
#include<stdio.h>
#ifdef DEBUG_ON
#define DBG_P(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
#define DBG_P(fmt, ...)
#endif
int main()
{
DBG_P("you are number %d\n", 42);
return 0;
}
注意:
- 因为printf这类打印函数的特性(参数可变),因此
DBG_P
在定义时用到了变参宏
(variadic macros),这是一项C99标准引入的新特性。 - 将宏函数定义成空,这样一来对宏函数的调用也就展开成空,这个特性非常关键!
以debug配置编译,打印语句有输出
$gcc -o util -DDEBUG_ON util.c
$ ./util
you are number 42
注意-DDEBUG_ON
并不是gcc的标准选项,只有-D
是,后面紧挨着的DEBUG_ON
是用户自定义的
以release配置编译,打印语句没有任何输出
$gcc -o util util.c
$ ./util
$
因为是演示,简单起见,release配置的定义就是“没有定义DEBUG_ON”
总结
如果是Linux驱动开发,可以使用现成的打印级别、DEBUG
宏和/proc/sys/kernel/printk
控制文件