有時候形式引數不確定,ansi c採用可變引數列表的形式來實現這種函式,在stdarg.h中包括三個巨集:va_list va_start (va_list,pre_arg)
va_arg(va_list,type) va_end(va_list),作用分別是:建立乙個指標指向函式的最後乙個引數;取出type型別的下乙個引數,並將va_list型別的變數指向下乙個變數,va_end結束可變函式.
以簡單的printf函式為例:
void printf(char *fmt)
int d;
char buf[10];
char ch;
va_list ap;//建立指標ap
va_start(ap,fmt)//將ap指向fmt的下乙個引數,fmt即輸出的格式字串
while(*fmt)//如果格式字串沒有到達『/0』
if(*fmt!='%')//如果是%格式串之前的字串常量,則輸出
putchar(*fmt++);
continue;//結束這次if
switch(*fmt)//如果到達%格式輸出,如%d等,這裡做了簡化,沒有考慮在%和d之間的- + 等輸出限定字元
case 'd'://如果是輸出整數
d = va_arg(ap,int);//利用va_arg巨集取出現在的ap指向的引數的值,並指向int型別後的下乙個引數
itoa(d,buf,10);//將整數轉換為字串,一般這個函式在stdlib.h裡,gcc好像只有atoi,自己寫了
puts(buf);//輸出整數
break;
case 'c'://輸出字元
ch = va_arg(ap,int)//注意int,因為可變引數預設使用型別提公升,所以char要寫成int型別
putchar(ch);
break;
case 's'://輸出字串
s = va_arg(ap,char *);
puts(s);
break;
default:
break;
fmt++;//指向格式串的下乙個字元
va_end(cp);
可變引數列表
模擬實現printf函式 va list是在c語言中解決變參問題的一組巨集,所在標頭檔案 include 用於獲取不確定個數的引數 va start,函式名稱,讀取可變引數的過程其實就是在堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程 va arg,這個巨...
可變引數列表
小二,上 class a public class varargs two param static void twostringparam string a,string b three param 參照上兩種寫法,一直往後面加。是不是感覺很憂傷 幸好這不是真的。string.a static v...
可變引數列表
測試環境 vs2008 1 可變引數列表 為什麼需要可變引數呢?在函式原型中,列出了函式期望接受的引數,原型只能顯示固定數目的引數,如果函式原型列出的引數與可呼叫引數不匹配或數目不一樣,程式將無法執行。例如,我們想要求一系列值的平均值,這裡的一系列的數目是不確定的,如果這些值儲存於陣列中,這個任務就...