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

用宏定义代替printf函数

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

问题

有时候我们想用宏定义来决定是编译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://xjtudll.cn/Exp/492/

标签: keilIAR
分享给朋友:

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

运放输出电压摆幅的问题

运放的输出电压是有限制的,普通运放的输出电压范围一般是(Vss+1.5~Vcc-1.5)V,比如电源电压是±15V,运放能输出的最低电压为-13.5V,最高电压为13.5V,超过这个电压范围即被限幅。这个特性导致电源电压不能被充分利用,特别是电池工作的设备,工作电压很低,这个问题特别突出,于是出现了...

iPad2插电循环重启,无法充电

老爷机iPad2最近发疯了: 1、不插充电器 无法开机; 2、插上普通充电器,木有反应; 3、插上专用的5V,2.1A充电器,有时可开机,但一会儿就关机了。然后又自动开机。循环往复。 经过分析,初步确定是电池有问题(机子本身无进水无维修) 可以参考下面的讨论: https://discussions...

Altium连续选择多个元件

Altium连续选择多个元件

以前在Protel99SE中,选中一个元件后,只要不取消选择(deselect),还可以接着选择元件,一直到足够为止。而Altium默认设置中,选择元件后,若你单击了PCB其他区域,之前的选择将失效,只能通过 Shift+鼠标单击来完成多个元件的选择。这种做法使得从Protel99SE转过来的用户极...

下载标准的好地方

最近几天,一直在寻找关于液晶石英表相关的标准,网上搜来搜去,终于在51zbz上找到了,只有这个地方可以免费下载,其他的不是要注册,就是要花钱买。 所以,向大家推荐这个网站:我要找标准(http://www.51zbz.com/)。 虽说能免费下载,但是此网站有几个缺点: 1、找不到站内搜...

OKI单片机-如何查看编译后的汇编代码

OKI单片机-如何查看编译后的汇编代码

使用OKI单片机时,有几种情况需要看汇编代码: 1、精确延时,这个用C基本上无法实现; 2、用汇编编程,但某部分程序用汇编写感觉有难度。此时先用C编写,然后查看其汇编代码,借鉴一二。 有两种方式可以看到编译后的汇编代码: 1、程序编译完成后,编译器自动生成各C文件的汇编代码 (1)能看到绝大部分汇编...

安装VS2010后打开ppt开始配置VS2010

安装VS2010后打开ppt开始配置VS2010

自从安装VS2010后,一打开ppt文件,就开始了配置VS2010的过程,如图所示。 问题的关键是,即使配置完了,下次打开ppt文件还是会提示这个,烦的要死。但是,不管是否等待配置完成或者取消配置,都能打开ppt文件。 网上搜索了一番,找到了解决办法: PowerPoint选项->...

发表评论

访客

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