va_list & vsprintf & vfprint
vsprintf & vfprintf
/* 将格式化的参数列表写入C字符串(字符数组) */
int vsprintf (char * s, const char * format, va_list arg );
/* 将格式化的参数列表写入文件流 (FILE * stdout) */
int vfprintf ( FILE * stream, const char * format, va_list arg );
sample
#include <stdargs.h>
#include <stdio.h>
void LOGD(const char* fmt, ...)
{
va_list args;
va_start(args, fmt); // 初始化va_list变量,第二个参数为最后一个显示声明的入参
char str[256] = {'\0'};
vsprintf(str, fmt, args);
printf("INFO: %s\n", str);
va_end(args);
}
void logPrint(int level, const char* msg, ...)
{
va_list args;
va_start(args, msg);
vfprintf(stdout, msg, args);
va_end(args);
fflush(stdout); /* 清空流缓冲区 */
return;
}
va_list
va_list实际上就是一个指针,不同平台定义的不一样。
typedef char * va_list; // x86平台下va_list的定义
va_start、va_arg、va_end都是预定义的宏,操作va_list指针:
va_start(arg, v) // 以固定参数的地址为起点确定变参的内存起始地址,arg指向第一个可选参数地址
va_arg(arg, type) // 返回第一个可选参数的值,类型为type,并将arg指向下一个参数地址
va_end(arg) // arg指针置为NULL
函数参数入栈的顺序是从右往左,依次入栈,va_list指针在函数堆栈中移动时,移动多少与前一个参数的类型有关
vsprintf
vsprintf将可变参数列表中的数据写入一个C字符串
int vsprintf (char * s, const char * format, va_list arg );
// Write formatted data from variable argument list to string