问题提出

有时候我们想用宏定义来决定是编译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(...)
#endifint _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语言开发上,切换版本非常方便。

用宏定义代替printf函数相关推荐

  1. #define宏定义形式的函数导致的bug

    定义了一个宏定义形式的"函数": #define  SUM8(YY)\ {\ int Y = YY>>2;\ ...\ } 然后使用的时候,传入了一个同名的变量Y: i ...

  2. 【GCC编译优化系列】宏定义名称与函数同名是一种什么骚操作?

    作者简介 *架构师李肯(全网同名)**,一个专注于嵌入式IoT领域的架构师.有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于 ...

  3. 函数式宏定义与普通函数的区别?C语言宏定义和宏定义函数 ?

    http://www.jb51.net/article/41869.htm 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧.传参.传返回 ...

  4. 如何用#define宏定义多行函数

    在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍.     首先,函数调用会带 ...

  5. C语言字符串、宏定义及主函数介绍

    希望你每天醒来都是阳光的,不会因为别人的几句话.几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事... ----  网易云热评 一.字符串 1.字符串声明 #include <st ...

  6. C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  7. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  8. 宏定义和inline函数的关联

    inline函数是C++引入的机制,目的是解决使用宏定义的一些缺点. 内联函数与宏定义区别 (1)内联函数在编译时展开,宏在预编译时展开: (2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换: ...

  9. C语言宏定义值为函数返回值

    在C语言编程过程中可能会遇到定义一个宏,但是这个宏的值是从另一个接口运行返回值. 可以使用如下我这种方式,demo代码如下: #include <stdio.h> #include < ...

最新文章

  1. react native 开发笔记(二)
  2. 逸仙电商企业网络推广如何打造出百亿完美日记后又收购高端护肤品牌
  3. 第一期站立会议2(11.16个人)
  4. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法
  5. 注册了patchwork.kernel.org
  6. SCCM SP 1中文版安装前需要更新的内容-Part1
  7. 稳压二极管型号详解(额定功耗3W)
  8. html 重复执行函数,javascript延时重复执行函数 lLoopRun.js
  9. 给机器学习面试者的十项建议 | 面试官角度
  10. U盘“请将磁盘插入U盘”的问题
  11. 教室录播系统方案_校园录播教室搭建方案?
  12. 3种结构ZnO基半导体纳米复合材料-图文详解
  13. 元宇宙:不透明面纱下的“康德主义”
  14. Windows10系统如何多开微信程序(上班划水必备)
  15. kettle转换中使用javascript例子整理(2)
  16. 大数据未来发展怎么样?
  17. 高等教育心理学:学生的认知发展
  18. Google新作synthesizer:Rethinking Self-Attention in Transformer Models
  19. access mysql odbc驱动程序_64位系统下access的64位odbc驱动
  20. Robotstudio软件:机床上下料工作站机器人示教编程

热门文章

  1. 多校1010 Taotao Picks Apples
  2. 原生JS和jQuery实现banner图滚动那些事
  3. CentOS 命令【备忘】
  4. Ubuntu 使用 heirloom-mail 调用外部邮箱 SMTP 服务器发送邮件
  5. WSDL中文版——详解
  6. windows平台cl.exe编译pcre 8.13
  7. STM32程序设计心得以及易错点
  8. 英语单词 factor cull
  9. springboot使用rabbitMQ(带回调)
  10. 【bootstrap组件】几个常用的好用bs组件