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] = {''};
    vsprintf(str, fmt, args);
    printf("INFO: %s
", 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
原文地址:https://www.cnblogs.com/cristiano-duan/p/12178101.html