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

用宏定义代替printf函数

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

问题

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

加速度传感器选型考虑

模拟输出VS数字输出 这个是最先需要考虑的。这个取决于你系统中和加速度传感器之间的接口。一般模拟输出的电压和加速度是成比例的,比如2.5V对应0g的加速度,2.6V对应于0.5g的加速度。数字输出一般是I2C或SPI接口。 如果你使用的微控制器有模拟输入口,比如PIC/AVR,你可以非常简单的使...

Quartus II计数器仿真:31之后变成字符

Quartus II计数器仿真:31之后变成字符

计数器波形仿真,在执行到31时会突然变成[] ! 之类的符号。如图: 原因: 信号的显示格式选择成了ASCII码,当数值等于ASCII码符号区的时候就会显示为符号了。 解决办法: 1、选择要显示的信号,右键,属性(Properties) 2、将显示格式改成自己所需的,一般是Hexadecimal...

Proteus网络标号自动加一

Proteus网络标号自动加一

在原理图界面,按A(切换到英文输入法),弹出如下窗口: 将PROPERTY=VALUE改成net=P0#,那么网络标号就会从P00开始自动加一,如图所示。...

Protel99SE PCB重复绘制导线

Protel99SE PCB重复绘制导线

Protel99SE PCB中,若相同Net的两个焊盘,默认是只能画一根导线的;或者说有三个相同Net的焊盘,那么只能将两边连起来,而有一边是无法连接起来的,如果你执意要连接,那么另外一边的导线将会自动去除。有没有什么办法重复绘制导线呢? Tools->Preference,将【Automat...

object-c 函数前面加号和减号 +和-的区别

简单来说就是: 加号 是可以通过类名直接调用这个方法; 减号则要实例化逸个对象,然后通过实例化的对象来调用该方法!! 使用的时候请注意。...

金蝶K3 引出序时簿提示:cannot update database of object is read only

金蝶K3 引出序时簿提示:cannot update database of object is read only

金蝶K3引出序时簿提示:cannot update database of object is read only 解决办法: 更换引出路径...

发表评论

访客

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