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

用宏定义代替printf函数

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

问题

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

金蝶 如何实现BOS单据下推下游单据后,不能将上游BOS单据反审核

金蝶 如何实现BOS单据下推下游单据后,不能将上游BOS单据反审核

【操作步骤】 1、使用系统管理员或者管理员组用户登陆K/3主控台,依次点击左上角【系统】→【K/3BOS】,使用有权限的用户登陆系统,进入【系统视图】界面,找到对应BOS单据发布的模块,双击进入单据界面; 2、进入上游自定义BOS单据的BOS 设计界面,单击菜单栏【编辑】→【操作...

Windows10 安装软件时提示 the error code is 2503/2502 错误解决办法

Windows10 安装软件时提示 the error code is 2503/2502 错误解决办法

问题内容:Windows10 安装软件时提示“ the error code is 2503/2502”错误代码分析原因:由于安装.msi格式的软件时,无法使用管理员身份运行,导致权限不够,从而引起2503/2502代码的错误解决方法:设置 C:\WINDOWS\TEMP的权限1、依次打开“ 我的电...

水晶报表 如何通过代码隐藏控件

水晶报表 如何通过代码隐藏控件

右击要设置的对象控件,点击“设置对象格式”,调出格式编辑器。点击“抑制显示”后面的编辑图标(见图红框处)。 在代码输入处输入以下代码: if  条件语句    then   true else &n...

android实现状态栏添加图标的函数

android实现状态栏添加图标的函数,具体如下: private void showNotification() { // 创建一个NotificationManager的引用 NotificationManager notificationManager = (NotificationM...

win7升级win10提示丢失api-ms-win-core-libraryloader-|1-1-1.dll

win7升级win10提示丢失api-ms-win-core-libraryloader-|1-1-1.dll

Win7 64bit 从win7升级到win10,到98%的时候提示说丢失.dll 解决办法: 用C:\Windows\System32\wimgapi.dll替换C:\Windows10Upgrade\wimgapi.dll即可 然后重新升级(由于相关文件已经下载好了,所以重新升级还是比较快的)...

位运算——交换两个数

交换两个数 交换两个数相信很多人天天写过,我也相信你每次都会使用一个额外来变量来辅助交换,例如,我们要交换 x 与 y 值,传统代码如下 int tmp = x; x = y; y = tmp; 这样写有问题吗?没问题,通俗易懂,万一哪天有人要为难你,**不允许...

发表评论

访客

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