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

用宏定义代替printf函数

xjtudll8年前 (2018-02-28)技术心得12540

问题

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

VS C#错误 未能找到类型或命名空间名称"xxxxxx"的真正原因

问题描述: 明明已经引用了项目(或DLL),但一编译就提示:未能找到类型或者命名空间。 根本原因还是引用的问题,引用错了,然后VS在这上面提示又不够智能 第一种可能: 这种可能性很好排查,A项目所使用的.net版本为3.5,B项目为4.0,那么A引用B是肯定要出事的 而错误提示就是那坑爹的未能找到类...

解决Virtualbox虚拟机下Android x86 4.0联网问题

解决Virtualbox虚拟机下Android x86 4.0联网问题

在Virtualbox中,把虚拟机网络设为“网络地址转换(NAT)”模式,高级中控制芯片(T)选择:PCnet-FAST III(Am79C973), 然后启动你的android-x86 4.0虚拟机,进入终端模拟器,输入以下命令: su ifconfig eth0 192...

STM8L PC0 PC1无法输出高电平

STM8L PC0 PC1无法输出高电平

MCU:STM8L151K4 参考代码: PC_DDR |= BIT1; PC_CR1 |= BIT1; PC_ODR |= BIT1; 现象: 无法输出高电平,一直是低电平 原因: STM8L PC0和PC1是N沟道开漏输出,所以必须接上拉电阻才能输出高电平。 以下截图来自于STM8L151...

Quartus II Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks

Quartus II编译某代码之后,老是提示如下warning: Warning: Found 6 node(s) in clock paths which may be acting as ripple and/or gated clocks -- node(s) analyzed as buf...

Altium 比较两个PCB的不同

Altium 比较两个PCB的不同

一般情况下,我们如果修改了PCB,都会标明大概修改了什么地方。但是有的时候,我们修改了PCB,却忘了标明改了什么地方,由于改动较小,过了一段时间之后,彻底忘了改了哪里。这时候要想知道改了哪里,该如何做? 首先,要说明的是,Altium本身的Compare功能是针对project自身的历史版本的(既可...

销售订单序时簿中过滤界面中,【名称】的下拉列表中无法选择到【购货单位】,也就是无法按【购货单位】过滤销售订单?

【操作步骤】   1、使用有权限的用户登录K3主界面后,单击左上角【系统】→【K/3BOS】,输入用户名及密码,登入账套,依次单击打开【供应链】→【销售管理】,找出业务单据销售订单并双击打开;   2、单击菜单【编辑】-【序时簿设置】,找到字段【购货单位$】,...

发表评论

访客

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