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
//#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
相关文章推荐
- c++11使用可变参数实现日志打印
- 优化打印调试信息(可变参数)
- 18、通过可变参数实现打印日志
- 用GCC和C99的可变参数宏, 更方便地打印调试信息
- 可变参数实现log打印
- C/C++中可变参数函数的实现
- C中可变参数列表函数的实现
- C语言中可变参数函数实现原理浅析
- C 语言下的 可变参数列表函数实现
- 可变参数列表的实现
- 利用可变参数打印出递归函数的树形输出
- C语言可变参数的函数实现
- 解析可变参数函数的实现原理(printf,scanf)
- 使用varargh.h来实现可变参数列表以及varargh.h实现
- 转:C语言可变参数实现
- 用C语言实现参数个数可变的函数
- 实现可变参数
- 可变参数宏(用于调试)
- C可变参数函数 实现
- C语言可变参数函数的实现[转]