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

用宏定义代替printf函数

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

问题

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

Xcode Error:ARC forbids explicit message send of release解决及自定义ARC

Xcode Error:ARC forbids explicit message send of release解决及自定义ARC

首先:Xcode 5中是可以选择是否用ARC的,在有ARC的时候,你完全不需要也不允许做retain,release,你要考虑strong 还是weak。推荐使用ARC。 如果不用ARC,是可以去掉的。在target->build settings里面,有个APPLE LLVM 5.0 La...

苹果电脑备份还原Windows操作系统

苹果电脑备份还原Windows操作系统

苹果电脑可以通过BootCamp安装Windows系统(毕竟,有很多“Just For Windows”和“IE Only”的软件和服务--比如国内的网上银行)。但是,苹果电脑的macOSX操作系统及其下的文件可以通过Time Machine备份、还原,通过BootCamp装的Windows系统及其...

BOS审批流如何查询出下一级待审核人信息

--根据名称查询出采购订单的类型ID,为1071 SELECT FID,* FROM ICClassType WHERE FName_chs Like '%采购订单_BOS%' --审批流对应的审核状态表的组合规则为:ICClassMCStatus+单据类型ID,审核记录表组合规则为:ICClass...

Proteus7.9 SP1安装包及和谐下载

Proteus7.9SP1安装包下载地址:http://d.1tpan.com/tp0050113584                 ...

金蝶 报废/补料是否会参与倒冲领料

金蝶 报废/补料是否会参与倒冲领料

产品入库倒冲领料单没有考虑报废补料数量,一般领料时则会考虑。此种情况可以通专过【报废倒冲领属料】的功能生成【生产领料单】。 请按下列方法步骤操作: 1、登录K/3主控台,依次单击【生产管理】→【生产任务管理】→【生产物料报废/补料】,双击【生产物料报废/补料单-维护】; 2、打开...

如何备份iOS4.2.1SHSH文件

如何备份iOS4.2.1SHSH文件

本教程指导大家如何备份iOS4.2.1的SHSH文件,使用工具为TinyUmbrella4.21.02,支持全系列的iPhone4,iPhone3GS,iPhone3G,iPod Touch4G,iPod Touch3G,iPod Touch2G和iPad。 没有越狱的用户或者还没有升级iOS4....

发表评论

访客

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