想想我們常使用的c函數printf();
printf("sum of %d, %d, %d, %d: %d\n", 1, 3, 5, 7, sum(1, 3, 5, 7));
of course, the result is: sum of 1, 3, 5, 7: 16;
爲什麼printf()可以使用個數不定的變量?這是因爲它內部使用了va_*系列函數(準確地說是宏)。
我們看看printf()的定義:
printf(const char *fmt, ...);
我們看到printf()函數的參數列表主要包含兩個重要的元素:
1.const char *fmt,這是唯一一個已知的變量。
2. ...,代表2nd,3rd,...等未知變量。
注:未知變量必須位於變量列表的末位。
那麼如何表達這些未知變量呢?
va_list類型(注意,這是一個類型)包含了此類變量列表的信息。So, 如果我們想要獲取未知變量的信息,我們這必須定義一個變量:
va_list ap;
void va_start(va_list ap, paraN);
Initializes ap to retrieve the additional arguments after parameter
//初始化ap,並使ap接收paraN之後的變量。也就量說paraN是最後一個已知變量
// va_start與va_end是一對宏,調用了va_start以示開始,就必須調用va_end以示結束。
<pre name="code" class="cpp">void PrintFloats (int n, ...)
{
int i;
double val;
printf ("Printing floats:");
// 定義一個接收variable arguments的變量。</span>
va_list vl;
// 初始化vl,以使vl指向n後的第一個variable argument.</span>
va_start(vl,n);
for (i=0;i<n;i++)
{
// 從vl中提取variable arguments。</span>
// 必須知道數據類型,如此例中的double。</span>
// 每次va_arg的調用都會改變vl的狀態。這樣下一次的調用就會返回下一個variable argument。</span>
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
// 取數完成.調用va_end()釋放vl。</span>
va_end(vl);
printf ("\n");
}