函式的可選性自變數
C語言允許定義自變數數量可變的函式,稱為variadic函式。variadic函式需要固定數目的強制性自變數,後面是數量可變的可選性自變數。
也就是說必須至少有一個強制性自變數。
variadic 可變引數數量有前面的強制性自變數決定,或者有定義可選性自變數列表的特殊值決定。
經典的函式是printf 和 scanf,這兩個是通過格式化字串來提取可變引數的數量的。
定義:
void test(int count, ...)
編寫variadic函式時,必須用va_list型別定義自變數指標,來在存取可選性自變數。
可以用 stdarg.h 標頭檔案中的四個巨集來處理自變數指標。
void va_start( va_list argptr, lastparam );
開始使用可選性自變數之前,先呼叫此巨集來初始化。
使用第一個可選性自變數的位置來初始化argptr指標,第二個引數為函式的最後一個有名稱引數。
void va_arg( va_list argptr, type );
取可選性自變數,並前移指標。type為可剛剛讀入的自變數型別。
void va_end( va_list argptr );
不再需要自變數指標時,呼叫va_end. 使用va_start 或 va_copy 來重新初始化且過的自變數指標,也要先呼叫va_end。
void va_copy( va_list dest, va_list src);
使用目前的src自變數初始化dest。
#include <stdio.h> #include <stdarg.h> //可選性自變數函式,count 為數量 void arg_var(char name[], int count, ...) { printf("name is: %s \ncount is: %d \n", name, count); va_list argptr; //定義自變數型別 va_start(argptr, count); //初始化自變數 for(int i=0; i<count; i++) { printf("%s \n", va_arg(argptr, char *)); //取值列印 } va_end(argptr); //結束使用 } int main(int argc, char * argv[]) { // call arg_var arg_var("abeen", 3, "strarg1", "strarg2", "strarg3"); }