標準C語言中函數定義要求參數的類型和個數都是固定的,但是有寫時候我們並不能確定參數的具體個數和類型,因此需要定義可變參函數,爲解決這個問題,C標準庫引入了stdarg.h,這個頭文件中定義了一些宏,用來實現定義可變參函數。典型的可變參函數如printf。但是C編譯器要求可變參數至少需要有一個固定參數。那麼要實現一個可變參函數,需要做那些操作呢,其實很簡單,只要做以下3步操作即可。
1、取得可變參數列表的指針。可以通過調用va_start()函數獲得。
2、對可變參數列表進行操作。通過va_arg()獲取每一個參數,調用一次獲取一個參數。你可以在任何時候停止調用va_arg(),來忽略後續的若干參數。
3、調用va_end()結束對可變參列表的引用。
有了這個步驟,實現一個可變參函數就比較簡單了,那我們先看下上面這幾個參數的原型。
va_list //用於指向可變參數列表
void va_start(va_list ap, last-required-parameter); //last-required-parameter 最後一個必須的參數
type va_arg(va_list ap, type); //type爲參數類型
void va_end(va_list ap);
下面看一段例子,看看如何使用上面的函數實現可變參函數:
#include <stdarg.h>
#include <stdio.h>
int add_em_up(int count, ...)
{
va_list ap;
int i;
int sum = 0;
va_start(ap, count);
for(i = 0;i < count; i++)
{
sum += va_arg(ap, int);
}
va_end(ap);
return sum;
}
int main(int argc, char **argv)
{
int sum;
sum = add_em_up(5, 3,4,5,6,7);
printf("sum = %d\n", sum);
return 0;
}
結果輸出:
sum = 25