1. va_list的基本原理和用法
#include<stdio.h> #include<stdarg.h> void func(int i,char *ch,...){ // format va_list ap; va_start(ap,ch); // 指向某一个参数,从此开始 char *str; str=ch; do{ printf("%s ",str); str=va_arg(ap,char*); // 需要指定参数类型为char*型,不够灵活 }while(str); } int main() { func(1,"A","B",NULL); return 0; }
2. va_list 与 vsprintf 配合使用
#include<stdio.h> #include<stdarg.h> void func(int i,char *fmt,...){ // format va_list ap; va_start(ap,fmt); char str[20]; vsprintf(str, fmt, ap); va_end(ap); printf("%s ",str); } int main() { char str1[]="str1"; char str2[]="str2"; int d=1000; func(1,"%s %s %d",str1,str2,d); return 0; }
这也正是 printf 的原理。
扩展:Modern C++中的 initializer_list。