Keilc中⾃定义带可变参数的printf函数
在嵌⼊式c中,往往采⽤串⼝打印函数来实现程序的调试,⽽在正式程序中⼀般是不需要这些打印代码的,通常做法是在这些调试⽤打印代码的前后设置⼀个宏定义块来实现是否启⽤这段代码,⽐如:
// other user code ...
#ifdef USE_DEBUG
printf("the monitor count is %d", count);
#endif
// other user code ...
如果定义了USE_DEBUG,则打印起作⽤;否则上述代码块不会被编译。
但上述代码块存在⼀个问题,当需要打印的地⽅很多时,都需要写这么⼀段,程序代码会显得⽐较臃肿和繁琐;如果能⾃⼰定义⼀个类printf 打印函数,在函数内实现上述代码块,这样代码是⽐较简便的,本⽂即实现该功能,⾃定义函数实现如下:
#ifdef USE_DEBUG 
#include <stdarg.h>    // 调⽤头⽂件
#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);
printf函数是如何实现的// other user code ...
总结:本⽂只是通过可变参数功能实现打印的⼀个⽰例,在程序代码中可以通过可变参数的系列功能宏定义与相关函数(⽐如vsnprintf、
va_arg等)实现更多的应⽤。