stdarg.h是C語言中C標準函數庫的標頭檔,stdarg是由standard(標準) arguments(參數)簡化而來,主要目的為讓函數能夠接收可變參數。C++的cstdarg標頭檔中也提供這樣的功能;雖然與C的標頭檔是相容的,但是也有衝突存在。
可變參數函數的參數數量是可變動的,它使用省略符號來忽略之後的參數。例如c語言中的printf函數一般。代表性的聲明為:int
check(int a, double b, ...); 可變參數函數最少要有一個命名的參數,所以char *wrong(...);在C中是不被允許的(在C++中,這樣的聲明是合理的)。C中,省略符號之前必須要有逗號;而在C++中,則沒有這種強制要求。
stdarg.h的資料類型:va_list 用來儲存宏va_arg與宏va_end所需資訊。
stdarg.h宏:va_start 使va_list指向起始的參數
va_arg
檢索參數
va_end
釋放va_list
va_copy 拷貝va_list的內容
訪問未命名的參數,首先必須在可變參數函數中聲明va_list類型的變數。調用va_start並傳入兩個參數:第一個參數為va_list類型的變數,第二個為省略符號前最後一個有名字的參數的名稱,接著每一調用va_arg就會返回下一個參數,va_arg的第一個參數為va_list,第二個參數為返回的類型。最後va_end必須在函數返回前被va_list調用(va_list當作參數)(沒有要求要讀取完所有參數)。C99提供額外的宏,va_copy,它能夠複製va_list。而va_copy(va2,
va1)函數作用為拷貝va1到va2。沒有機制定義該怎麼判別傳遞到函數的參數量或者資料類型。函數通常需要知道或確定它們變化的方法。共通的慣例包含:使用printf或scanf類的格式化字串來嵌入明確指定的類型。在可變參數最後的標記值(sentinel
value)。總數變數來指明可變參數的數量。
例子:
#include <stdio.h>
#include <stdarg.h>
void printargs(int arg1, ...) //輸出所有int類型的參數,直到-1結束
{
va_list ap;
int i;
va_start(ap, arg1);
for (i = arg1; i != -1; i = va_arg(ap, int))
printf("%d ", i);
va_end(ap);
putchar('\n');
}
int main(void)
{
printargs(5, 2, 14, 84, 97, 15, 24, 48, -1);
printargs(84, 51, -1);
printargs(-1);
printargs(1, -1);
return 0;
}
這個程式產生輸出:
5 2 14 84 97 15 24 48
84 51
1