博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Keil c中自定义带可变参数的printf函数
阅读量:4519 次
发布时间:2019-06-08

本文共 964 字,大约阅读时间需要 3 分钟。

在嵌入式c中,往往采用串口打印函数来实现程序的调试,而在正式程序中一般是不需要这些打印代码的,通常做法是在这些调试用打印代码的前后设置一个宏定义块来实现是否启用这段代码,比如:

// other user code ... #ifdef USE_DEBUGprintf("the monitor count is %d", count);#endif// other user code ...

如果定义了USE_DEBUG,则打印起作用;否则上述代码块不会被编译。

但上述代码块存在一个问题,当需要打印的地方很多时,都需要写这么一段,程序代码会显得比较臃肿和繁琐;如果能自己定义一个类printf打印函数,在函数内实现上述代码块,这样代码是比较简便的,本文即实现该功能,自定义函数实现如下:

#ifdef USE_DEBUG  #include 
// 调用头文件#define bufsize 120 char buffer[bufsize];  // 待打印字符串缓存#endif// 自定义打印函数void envprintf(const char * str, ...){   #ifdef USE_DEBUG  va_list args;  va_start(args, str);   vsnprintf(buffer,bufsize,str,args);   va_end(args);  printf("%s\n", buffer);  #endif}

 

上述代码中的vsnprintf函数将多变参数转换成字符串并保存至buffer中; 最后通过printf打印出来。 

改进后程序中打印代码如下:

// other user code ... envprintf("the monitor count is %d", count);// other user code ...

 

总结:本文只是通过可变参数功能实现打印的一个示例,在程序代码中可以通过可变参数的系列功能宏定义与相关函数(比如vsnprintf、va_arg等)实现更多的应用。

 

转载于:https://www.cnblogs.com/raswin/p/10494196.html

你可能感兴趣的文章
nginx 安装
查看>>
C#中upd分包与发送,已经实现全部代码
查看>>
让插件帮你优化代码
查看>>
学习笔记3
查看>>
LeetCode 20. Valid Parentheses
查看>>
LeetCode 4 Keys Keyboard
查看>>
bean找不到异常
查看>>
重拾Javascript基础(三) - DOM属性&方法
查看>>
电感在电路中的作用(硬件01)
查看>>
ng 动态的生成option。
查看>>
ORACLE-12C-RAC INSTALL
查看>>
LintCode-Topological Sorting
查看>>
自定义引用类型的Enumerable.Union调用(原创)
查看>>
Keil c中自定义带可变参数的printf函数
查看>>
抽象类实例
查看>>
react context prop-types
查看>>
Java之路——Java初接触
查看>>
2018.12.27学习JavaScript
查看>>
Cocoa编程开发者手册
查看>>
C++框架_之Qt的开始部分_概述_安装_创建项目_快捷键等一系列注意细节
查看>>