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

用宏定义代替printf函数

xjtudll7年前 (2018-02-28)技术心得7440

问题

有时候我们想用宏定义来决定是编译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函数” 的相关文章

ML610Q4xx LCD Simulate仿真

ML610Q4xx LCD Simulate仿真

通过DTU8 Debugger和LCD Image Assignment Tool,可以实现LCD仿真,这样可以很方便的调试程序。 如何实现LCD仿真,可以查看《LCD Image Tool User’s Manual》,文件名为:FEXTLcdImgToolU8_UM-07.pdf。这...

CRC除法

所有CRC原理介绍中,都会提到CRC除法。CRC除法与算术除法有什么区别呢?下面举个实例来说明。 以下是120 ÷ 9 来举例说明CRC除法: 120 = 1111000 B 9 = 1001 B  ...

Proteus 7.7 SP2破解及下载

不得不说,Proteus升级的太快,7.6SP4国人还没破解完好,7.7 SP2和谐版就有了。我倒。 Proteus 7.7 SP2相比7.6 SP4只是多了几个PIC和MSP430的模型,貌似MSP430新增的还是2xx系列。 下载地址: 国外网站,请单击进入网页下载,只能用单线程,多线程下载器无...

对于不返回任何键列信息的 selectcommand 不支持 updatecommand 的动态 sql 生成

https://www.cnblogs.com/xuqiang/archive/2010/03/07/1953720.html 大家知道,DataSet保存的数据是位于服务器内存里面的原数据库的“副本”。所以用DataSet更新数据的过程就是先对“副本&rdquo...

ios设备分辨率、屏幕尺寸、屏幕密度

iPhone Devices iPhone 5S Retina 4" Screen 326ppi 16:9 640 x 1136 px 123.8 x 58.6 x 7.6 mm 112...

Protel99SE高级规则设定

Protel99SE高级规则设定

1、Protel99SE高级间距规则 Protel99SE间距规则是在Rules里面设置的,通常我们只是设置整个PCB的间距,实际上我们可以单独设置各类间距,比如覆铜间距,过孔与过孔间距,焊盘到焊盘间距,焊盘到过孔间距等等。 Design->Rules->Routing->Clea...

发表评论

访客

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