您的位置:首页 > 其它

C中可变参数宏实现调试打印

2010-03-19 09:06 288 查看
在调试程序时,常常需要添加打印信息,而在正式发布时则需要关闭这些打印语句,常用如下形式,通过开启和注释DEBUG宏即可实现打印语句的开关:

//#define DEBUG
#ifdef DEBUG
# define debugk(fmt,...) printk(fmt ,__VA_ARGS__)
#else
# define debugk(fmt,...)
#endif

debugk(fmt,...)是一个可变参数的宏,此格式是新的C99规范中新增的,目前只有gcc支持(VC6.0的编译器不支持),用法如下:

debugk (
"/n/t frame len bad = %d/n", len );

若只有一个参数:

debugk (
"hello world!/n" );

则编译时gcc会报错,“error: parse error before ')' token”,原因为宏展开后多了一个”,”, C99的规范没有定义这个问题的解决方案,gcc对此做了扩展,可在__VA_ARGS__前添加”##”,当可变参数的个数为0时,这里的”##”起到把前面多余的","去掉的作用,实际上变成了printk(msg),这样编译就可以通过。

# define debugk(fmt,...) printk(fmt
, ##__VA_ARGS__)

__VA_ARGS__这个宏不便于记忆,gcc对此做了扩展,另一种可接受的定义方法为:

# define debugk(fmt,args...) printk(fmt , ##args)

需要注意的是,用__VA_ARGS__时,debugk(fmt,...)不能有args,用args时,debugk(fmt, args...)必须有args,否则编译时会提示__VA_ARGS__无定义或args无定义。

最终的推荐形式为:

//#define DEBUG
#ifdef DEBUG
# define debugk(fmt,args...) printk(fmt ,##args)
#else
# define debugk(fmt,args...)
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: