问题提出
有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会。我们总不能对每一条printf都这样写:
#if _DEBUG_
printf("hello world!");
#endif
这样子实在是太麻烦了!万一要各个地方都要打印,会使版面看起来很乱。
解决方法
我后来想到一个方法,可以使用宏定义代替printf函数,由于printf是可变参数的函数,这里就要用到变參宏(…和__VA_ARGS__)。
在头文件下写此代码
#define _DEBUG_ 1
#if _DEBUG_
#define PR(...) printf(__VA_ARGS__)
#else
#define PR(...)
#endif
后面需要打印调试信息的时候使用PR宏就可以了,如果需要release版本,不打印调试信息,就把DEBUG设置为0,编译出来的程序就不会打印调试信息了。
示例代码清单
开发环境VS2013。当DEBUG设置为1,打印PR的信息;当DEBUG设置为0,不打印PR的信息。
#include "stdafx.h"
#define _DEBUG_ 1
#if _DEBUG_
#define PR(...) printf(__VA_ARGS__)
#else
#define PR(...)
#endif
int _tmain(int argc, _TCHAR* argv[])
{
printf("debug test!\r\n");
PR("hello world!\r\n");
PR("string:%s\r\n", "data");
PR("integer:%d\r\n", 100);
return 0;
}
提醒
该技巧可以用在单片机C语言开发上,切换版本非常方便。
keil环境下如何重定向printf到串口,可以参考这里。
本文介绍了一种使用宏定义控制程序中调试信息输出的方法。通过定义宏PR来替代printf函数,可以根据_DEBUG_宏的值决定是否输出调试信息,从而简化代码并方便地切换debug和release版本。
1151

被折叠的 条评论
为什么被折叠?



