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

用宏定义代替printf函数

xjtudll6年前 (2018-02-28)技术心得6810

问题

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

NSTextfield只允许输入数字

.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertical-align: -10%;-webkit-user-select: none;} .wiz-t...

Keil优化导致代码出错

Keil优化导致代码出错

Keil在优化代码的时候,对于一些隐式调用,会出错的。 例如(以下例子来源于参考资料): 你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它: void (*UserProgram)();    &...

Windows7画图调整橡皮擦大小

Windows7画图调整橡皮擦大小

Windows7自带的画图软件,如何调整橡皮擦大小呢? 方法1:选中橡皮擦 ,在菜单栏找到“粗细”,选中不同的宽度即可。如下图所示。但是这个方法有个缺点,如果要将橡皮擦调整到很小的宽度,则没法实现。 例如,想使用1px的橡皮擦,怎么办? 这个时候就要用到方法2了。 方法2:...

运放和比较器的区别及比较器技术参数

1、运放和比较器区别 (1)放大器与比较器的主要区别是闭环特性 放大器大都工作在闭环状态,所以要求闭环后不能自激。而比较器大都工作在开环状态更追求速度。对于频率比较低的情况放大器完全可以代替比较器(要注意输出电平),而比较器大部分情况不能当作放大器使用。 因为比较器为了提高速度进行优化,这种优化却减...

Proteus运行找不到sdf文件解决方法

Proteus运行找不到sdf文件解决方法

很多人在用Proteus的时候,Proteus会提示找不到sdf文件,如图所示。提示Cannot open …… .sdf。这种情况经常出现在电子类软件,主要是软件仿真过程中使用的文件不能在有中文路径的文件夹里。用Mulitism的时候也会出现这个问题的。这个原因很简单,...

将rdlc报表作为资源嵌套使用

将rdlc报表作为资源嵌套使用

参考资料: 2. 如何将嵌入的资源读取出来,作为报表查看器控件的来源呢? 也就是说,我们可以通过LocalReport的一个特殊属性(ReportEmbeddedResource)来很方便地实现该需求 实际上路径一般默认是类名+文件夹名 我的程序包名是XonixERP.View,然后又有三层文...

发表评论

访客

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