c語言中的可變引數是乙個比較有意思的實現,通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數(不固定)。
看乙個例子,求取幾個數裡面的最大值。
主要**如下:
int max(int n,...)
va_end(arg,int);
return max;
}
關鍵問題是搞懂va_list,va_start,va_arg,va_end幾個的功能。
va_list:
功能:用來儲存巨集va_start、va_arg和va_end所需資訊的一種型別。為了訪問變長引數列表中的引數,必須宣告va_list型別的乙個物件;
void va_start ( va_list ap, paramn );
功能:訪問變長引數列表中的引數之前使用的巨集,它初始化用va_list宣告的物件,初始化結果供巨集va_arg和va_end使用;
type va_arg ( va_list ap, type );
功能:返回下乙個引數的值;
void va_end ( va_list ap );
功能:該巨集使程式能夠從變長引數列表用巨集va_start引用的函式中正常返回。
va在這裡是variable-argument(可變引數)的意思.
這些巨集定義在stdarg.h中,所以用到可變引數的程式應該包含這個標頭檔案.
綜合上面3個巨集和乙個型別可以猜出如何實現c語言可變長引數函式:用 va_start 獲取引數列表(的位址)儲存到 ap 中,用 va_arg 逐個獲取值,最後用 va_end 將 ap 置空。
可變引數的限制
注意:可變引數必須從頭到尾逐個訪問。如果在訪問了幾個可變引數之後想半途終止,這是可以的;但是,如果一開始就訪問引數列表中間的引數,那是不行的。
引數列表中至少有乙個命名引數。如果連乙個命名引數都沒有,就無法使用va_start。
這些巨集是無法直接判斷實際存在引數數量的。
這些巨集無法判斷每個引數的型別。
如果在va_arg中指定了錯誤的型別,那麼其後果是不可**的。
可變引數列表解析
在c語言中 有些函式我們無法確定其需要傳遞的引數的個數 可以用省略號指定引數。它是利用函式傳參時的過程實現的,函式傳參過程是以棧的形式訪問的。關於函式棧幀 通過下面的 來演示 include include int add int n,n為後面引數的個數,為可選引數 int main 執行結果 在v...
可變引數列表解析
1 printf d n 2018 2 printf s n hello world 3 printf d s n 2018,i m fine.int printf const char format,1 va list arg 2 void va start va list arg ptr,pre...
可變函式列表解析
可變函式列表解析 c語言中的可變引數是乙個比較有意思的實現,通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個函式。在c語言中printf scanf等都為支援可變引數的函式,可以有多個引數。對於可變引數列表,我們可以通過乙個例子來進行深入了解 例如1 實現乙個函式可以求任意個引...