一、定義
在C++中又函數重載功能,C語言中也是又類似功能的,如經常見到的 int fun(char *format, ... ),該函數的參數個數是未定的,以此實作了類似重載的功能,我們用的最多的printf() 函數就是這樣實作的,現在來講講這個怎麼用:
正如大家知道的那樣,函數傳入的參數是儲存在棧中的,第一個參數在棧的最頂端,最後一個參數在棧的最底端,
對于函數void fun(char *formt,...);進行調用fun("a","b","c","d","e","f","g");
va_list:複合類型,va_list args;聲明變量args,可以看作為一個指針
va_start(args, formt):将args指向第一個參數"a"
va_arg(args, 參數類型):args指向下一個參數
va_end(args):将args置為無效
二、使用
#include <stdarg.h>
#include <iostream>
void fun(int a,...)
{
va_list pp;
int n=1;
va_start(pp,a);
do
{
printf("第 %d 個參數 =%d\n",n++,a);
a=va_arg(pp,int);
}
while (a!=0);
va_end(pp);
}
int main()
{
fun(20,40,60,80,0);
return 0;
}

VA_LIST的用法:
(1)首先在函數裡定義一具VA_LIST型的變量,這個變量是指向參數的指針;
(2)然後用VA_START宏初始化變量剛定義的VA_LIST變量;
(3)然後用VA_ARG傳回可變的參數,VA_ARG的第二個參數是你要傳回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG擷取各個參數);
(4)最後用VA_END宏結束可變參數的擷取。
參考:
va_start()va_end()和vsnprintf()函數應用_算法随筆-CSDN部落格
va_list使用方法_一個菜鳥-CSDN部落格_va_list