C语言的变参列表 va_list

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。

原文地址:https://www.cnblogs.com/abnk/p/11224090.html