【转】用宏定义代替printf函数
问题提出
有时候我们想用宏定义来决定是编译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", ); return ;
}
提醒
该技巧可以用在单片机C语言开发上,切换版本非常方便。 
keil环境下如何重定向printf到串口,可以参考这里。
【转】用宏定义代替printf函数的更多相关文章
- 用宏定义代替printf函数
		
来自:http://blog.csdn.net/yannanxiu/article/details/52506451 #define _DEBUG_ 1 #if _DEBUG_ #define PR( ...
 - #define宏定义形式的"函数"导致的bug
		
定义了一个宏定义形式的"函数": #define SUM8(YY)\ {\ int Y = YY>>2;\ ...\ } 然后使用的时候,传入了一个同名的变量Y: i ...
 - C++内联函数、宏定义和普通函数的区别
		
C++内联函数.宏定义和普通函数的区别? 宏定义:在预处理阶段进行简单的文本替换,不会进行参数类型检查: 内联函数:在编译器的时候进行代码插入,编译器会在每次调用内联函数的地方直接将内联函数的内容展开 ...
 - C 语言宏定义函数编写时 do-while 的妙用和一些注意事项
		
在 C 语言中,我们都知道可以用宏定义来编写函数,一般称为宏函数.如果一个宏函数比较复杂,那么在编写这样的宏函数是有一定技巧和注意事项的.文章给出一些我认为值得关注的地方,以及一些注意事项(个人建议) ...
 - 【C++】函数指针宏定义
		
看耗子叔文章学习虚函数表(http://blog.csdn.net/haoel/article/details/1948051)的时候被例子的第一句惊到了 typedef void(*Fun)(voi ...
 - (转载)内联函数inline和宏定义
		
(转载)http://blog.csdn.net/chdhust/article/details/8036233 内联函数inline和宏定义 内联函数的优越性: 一:inline定义的类的内联函 ...
 - 【C++】内联函数(inline)和宏定义(# define)的优劣及其区别
		
一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种 ...
 - 黑马程序员——C语言基础   枚举 宏定义 自定义 static exterm
		
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...
 - C Program基础-宏定义
		
写好c语言,漂亮的宏定义是非常重要的,我们在阅读别人工程时,往往能看到大量的宏定义,宏定义可以增加代码的可读性,也能增加代码的可移植性,一个好的宏定义甚至是一件艺术品.今天我们就来看看宏定义的方方面面 ...
 
随机推荐
- 【APIO2016】烟火表演
			
题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...
 - copy constructor
			
copy constructor也分为trivial和nontrivial两种 如果class展现出bitwise copy semantics(按位拷贝语义),则不会构造出 copy constru ...
 - libmysqlclient.so.16: cannot open shared object file: No such file or directory
			
编译安装的mysql5.6.39,安装目录是/usr/local/mysql,启用程序时报错:libmysqlclient.so.16: cannot open shared object file: ...
 - CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
			
下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...
 - this.$http.post ||this.$http.put||vue 获取url参
			
getClasslist() { this.$http.get('/xxxxx/childlist', { params: { ServiceUnitId: localStorage.getItem( ...
 - shell脚本--逻辑判断与字符串比较
			
涉及到比较和判断的时候,要注意 整数比较使用-lt,-gt,ge等比较运算符,详情参考:整数比较 文件测试使用 -d, -f, -x等运算发,详情参考:文件测试 逻辑判断使用 && ...
 - PAT L2-022 重排链表
			
https://pintia.cn/problem-sets/994805046380707840/problems/994805057860517888 给定一个单链表 L1→L2→⋯→ ...
 - Java Heap Dump On OutOfMemoryError
			
-XX:+HeapDumpOnOutOfMemoryError Batch "C:\Program Files\Java\jdk1.8.0_162\bin\java.exe" -X ...
 - JQuery插件:图片上传本地预览插件,改进案例一则。
			
/* *名称:图片上传本地预览插件 v1.1 *作者:周祥 *时间:2013年11月26日 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari *插 ...
 - node的读写流
			
let http = require('http'); http.createServer((req,res)=>{ res.end(); }).listen(,()=>{ console ...