用宏定义代替printf函数
问题
有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会。我们总不能对每一条printf都这样写:
#if
_DEBUG_printf("hello world!");
#endif
太麻烦!
GCC编译器解决方法
我后来想到一个方法,编译器为GCC,可以使用宏定义代替printf函数,由于printf是可变参数的函数,这里就要用到变參宏(…和__VA_ARGS__)。
在头文件下写此代码
#define _DEBUG_ 1
#if _DEBUG_
#define PR(...) printf(__VA_ARGS__)
#else
#define PR(...)
#endif
后面需要打印调试信息的时候使用PR宏就可以了,如果需要release版本,不打印调试信息,就把DEBUG设置为0,编译出来的程序就不会打印调试信息了。
keil C51中的问题
gcc编译器与c51是两个不同的编译器,所以C语言编译的标准也是不同的。
如果C51使用GCC编译标准宏定义代替printf函数,你的代码将会报错,C51的缓存内存是有限的,宏定义是 不允许有定义不定参数函数的。我想了好久,它不给宏定义不定参数函数,但却可以使用printf不定参数函数,我可不可以跳过不定参数函数呢?
#define _debug_ 1
#if _debug_
#define debug_printf printf
#else
#define debug_printf //
#endif
巧妙的利用define 代替的特性,如果_debug_等于1时,debug_printf 等于printf ,打印正常输出 ,但_debug_等于0时,打印将关闭,debug_printf 将等于 // ,编译时后面打印的将被注释掉。
IAR编译器解决
IAR中可以用((void)0),函数就无效了
#ifdef _DEBUG_
extern void pf(const char *fmtstr, ...) ;
#else
#define pf(fmt, ...) ((void)0)
#endif
#endif
参考资料:
http://blog.csdn.net/Wekic/article/details/77419166?locationNum=6&fps=1