当前位置:首页 > 技术心得 > 正文内容

用宏定义代替printf函数

xjtudll9年前 (2018-02-28)技术心得13640

问题

有时候我们想用宏定义来决定是编译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

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://www.xjtudll.cn/Exp/492/

标签: keilIAR
分享给朋友:

“用宏定义代替printf函数” 的相关文章

Proteus7.8 SP2安装及破解包下载

老王这个人确实很牛啊,之前Proteus7.6和Proteus7.7都是他破解的,现在又将Proteus7.8 SP2破解了。   大概看了看,Proteus7.8新增的是几个PIC的单片机 Proteus7.8安装包下载地址: http://cache.ourdev.cn/bbs...

运放芯片不用的输入端的处理

本文转载自21IC论坛。 对于数字器件,尤其是CMOS器件,不用的输入端不能悬空,这个道理好像已经尽人皆知了。至少在21IC,时不时就会有人发帖让大家“温习”这个问题。但对于模拟器件,好像认识还有些模糊。 就以运放为例。多运放芯片中不用的运放怎么处理,好像是新手们的一个共同疑问。(有这个疑问是好...

静电实验平台的搭建及要求

静电实验平台的搭建及要求

Test setup 1、Cables: 2m, with 470KΩ * 2 ---EUT and Metal HCP (Horizontal Coupling Plate); ---HCP and Metal Plate connected to the ground 2、Insu...

如何通过程序清除蓝牙缓存的设备名称?

http://stackoverflow.com/questions/10793761/how-to-programmatically-clear-the-bluetooth-name-cache-in-android 现象: 一个已经配对过的蓝牙设备,修改名称之后,手机上显示的依旧是以前的名称,并...

一些奇葩问题

1、排针居然有电阻 问题描述: 排针的不同PIN之间用万用表测量居然是有电阻的 原因: 排针质量有问题,老化   2、按键 问题描述: 导通电阻不是0,200欧姆~2k欧姆不等 原因: 按键老化 这种有导通电阻的,对于独立式按键来说影响不大,对于AD键盘而言,影响将很明显,很有可能导致误判...

Multisim几则使用技巧

Multisim几则使用技巧

  Multisim是加拿大图像交互技术公司(Interactive Image Technoligics简称IIT公司)推出的以Windows为基础的仿真工具,适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式,具有丰富的仿真分析能力。 这两天...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。