用宏定义代替printf函数

0

本文作者:xjtudll  发布于:2018-2-28  分类:技术心得  点击:


问题

有时候我们想用宏定义来决定是编译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

本文标签: keil  IAR  
本文Url: http://www.xjtudll.cn/Exp/492/ (出自: 鸟的天空)
我要引用: 点击这里获取该日志的TrackBack引用地址

相关文章:

481. VSPD + Keil 实现串口的仿真调试  (2017-11-30 14:52:31)

465. C51: LOCATING INITIALIZED VARIABLES AT ABSOLUTE ADDRESSES 如何初始化绝对定址的变量  (2017-8-5 14:4:7)

458. IAR STM8 #pragma optimize 指令  (2017-6-18 9:23:9)

450. IAR STM8嵌入汇编  (2017-4-17 12:5:34)

439. Keil优化导致代码出错  (2017-2-11 14:21:21)

438. Keil优化及如何设置某段代码不优化  (2017-2-2 14:20:25)

432. Keil得到C编译之后的汇编代码  (2016-12-25 17:58:11)

431. Keil error C272: '__asm' requires src-control to be active 解决办法  (2016-12-20 10:21:12)

409. Keil C51过滤0xfd字符的bug(某些汉字无法正常显示)  (2016-6-27 12:5:7)

341. Keil WARNING L16: UNCALLED SEGMENT……解决  (2014-10-18 8:51:25)

0 Comments

Write a comment ?