C语言宏的空展开应用案例:定义仅在debug版本执行的打印函数

背景

在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;
}

注意:

  1. 因为printf这类打印函数的特性(参数可变),因此DBG_P在定义时用到了变参宏(variadic macros),这是一项C99标准引入的新特性。
  2. 将宏函数定义成空,这样一来对宏函数的调用也就展开成空,这个特性非常关键!

以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控制文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值