乙個函式可以用不同型別的不同數量的引數來呼叫。包含檔案stdarg.h宣告乙個型別va_list,並定義了三個巨集,用於逐步遍歷被呼叫函式不知道其數量和型別的引數列表。在使用過程中需要包含標頭檔案stdarg.h:
#include
void va_start(va_list ap, last);
#define va_start(list,param1) // ( list = (va_list)¶m1+ sizeof(param1) )
a)va_start()巨集初始化ap,以便va_arg()和va_end()後續使用,必須首先呼叫該巨集。
b)last是變數引數列表前最後乙個引數的名稱,也就是呼叫函式的最後乙個可知的引數的型別。
type va_arg(va_list ap, type);
#define va_arg(list,mode) //( (mode *) ( list += sizeof(mode) ) )[-1]
a)引數ap是由va_start()初始化的va_list ap。每次呼叫va_arg()都會修改ap,以便下一次呼叫返回下乙個引數。引數型別是指定的型別名稱,這樣就可以通過在型別中新增來獲得指向具有指定型別的物件的指標的型別。
b)va_arg()巨集在va_start()巨集之後的第一次使用將返回在last之後的引數。連續的呼叫返回其餘引數的值。
c)如果沒有下乙個引數,或者型別與實際的下乙個引數的型別不相容,將會發生隨機錯誤。
void va_end(va_list ap);
#define va_end(list) //( list = (va_list)0 )
每次對va_start()的呼叫都必須與同乙個函式中對應的va_end()呼叫相匹配。在呼叫va_end(ap)之後,變數ap是未定義的。可以對列表進行多次遍歷,每個遍歷都由va_start()和va_end()括起來
void va_copy(va_list dest, va_list src);
實現乙個列表的拷貝。不常用。
乙個簡單的相同型別不同數量的引數:
#include
#include
inttest
(int num,..
.);int
main
(void
)int
test
(int num,..
.)va_end
(ap)
;// 清空ap
return arg_count;
}
執行結果
0-1
1-22
-33-
44-5
5
C語言變參使用
c語言中有很多變參的使用,例如printf 的原型是int printf const char fmt,那麼c語言是如何解析和處理這些變參的呢?下面進行簡單的總結 c語言中定義了下面的一些巨集,專門用來處理變參 va start va list ap,char fmt va arg va list ...
C語言(變參函式)
c語言雖然沒有c 的函式過載特性,但也可以實現變參,但要保證第乙個引數資訊的完整性。拓展 定義變參函式時,第乙個引數一般是字串,攜帶後續變參的型別和數量資訊,變參使用三點來表示,如 void sumup const char info,再使用va list va start va arg 和va e...
C語言變參,記錄
由於在 c語言中沒有函式過載 解決不定數目函式引數問題變得比較麻煩 即使採用 c 如果引數個數不能確定 也很難採用函式過載 對這種情況 有些人採用指標引數來解決問題.uhmm 用到的變參地方 用的原因 1,sql 語言必須用常量2,sql語言格式不相同,引數個數不相同使用a dyw mysql nu...