就是傳入函式的參數是不固定的
可多可少
例如printf
int printf(const char *format [,argument]...);
那個中括號括起來的arguement可多可少
而且還可以不同型態
這就是不定參數
可以想像這些不定參數是以stack的方式存起來的
c語言提供va_list可以來實作不定參數的函式
va_start , va_arg , va_end是macro
而va_list是一個char *的型態
va_start做的事就是把va_list的指標指到第一個不定參數
va_arg做的事是以指定型態從va_list取出資料並把va_list指標指到下一個位置
va_end做的事就是當資料取完後把va_list歸零
參考
http://blog.pixnet.net/chiahsiang/post/13125997
http://zhanjun.net/?q=node/23
這篇比較詳細
附上code
/* va_arg example */
#include
#include
#include
void PrintLines ( char* first, ...)
{
char* str;//這個指標是為了在呼叫 va_arg 後,推進指標,用來儲存下一個arg用的
va_list vl;//放置arg陣列的指標名稱
//str=first;//原始code裡面寫的,原本的用途在文章下面會寫
printf("%s\n" , first);//用這一行來取代原始code裡面印出first第一個參數的功能
va_start(vl,first);//初始化
do {
str=va_arg(vl,char*);//這行執行後,str裡面儲存的就是第二個參數的位址了
printf ("%s\n",str);
} while (str!=NULL);
va_end(vl);
}
int main ()
{
PrintLines ("First","Second","Third","Fourth",NULL);
system("pause");
return 0;
}
上面的 code 是從 http://blog.pixnet.net/chiahsiang/post/13125997 複製過來的
不過我有改掉一些地方
因為原本的code為了依序顯示出 first second third fourth
而造成寫法上不易理解 va_start 的前面為什麼要加上 str=first,其實那是不需要的
原始寫法中,先 str=first 之後就可以在do while迴圈中先印出 str 的值
其後再用 va_arg 將下一個參數的位址放到str裡面。
不過這跟在迴圈外面印出 first 意思是一樣的
沒有留言:
張貼留言