在c中,可變引數用於引數個數,型別不確定的情況,如printf,snprintf函式的實現。
當我們無法列出傳遞函式的所有實參的型別和數目時,可以用省略號指定參數列
void func(...);
void func(parm_list,...);
這是c傳參的一種形式,與固定引數不同。
函式引數以棧的形式儲存,從右往左入棧。
舉個例子:
void func(int x, float y, char z);
在呼叫函式的時候,實參z先入棧,然後是y,最後是x。在記憶體中變數的存放次序是x->y->z。所以,從理論上來說,只要知道x,y,z其中乙個變數的位址和型別,通過指標運算,可找到其他變數。
中定義了如下幾個巨集:
typedef char* va_list;
void va_start ( va_list ap, prev_param ); /* ansi version */
type va_arg ( va_list ap, type );
void va_end ( va_list ap );
va_list是指向當前引數的指標,通過這個指標進行取參。
巨集的使用方式如下:
先定義乙個va_list的變數,假設為ap
使用va_start對ap進行初始化,va_start的第乙個引數是ap,第二個引數是變參表中「…」前面的那個引數
然後呼叫va_arg獲取引數,第乙個引數還是ap,第二個引數是要獲取的引數的型別,並且ap指向下乙個變數
獲取完引數後,使用va_end關掉ap。va_start和va_end通常成對出現。
例子:
#include #include #include int my_snprintf(char *dst, int size, char *fmt, ...)
int main(void)
可變引數及可變引數巨集的使用
我們在c語言程式設計中會遇到一些引數個數可變的函式,例如printf 這個函式,這裡將介紹可變函式的寫法以及原理.一般在除錯列印debug 資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc 也支援可變引數巨集,但是兩種在細節上可...
可變引數函式使用
va函式的定義和va巨集 c語言支援 va函式,作為 c語言的擴充套件 c 同樣支援 va函式,但在 c 中並不推薦使用,c 引入的多型性同樣可以實現引數個數可變的函式。不過,c 的過載功能畢竟只能是有限多個可以預見的引數個數。比較而言,c中的 va函式則可以定義無窮多個相當於 c 的過載函式,這方...
可變引數列印 解析可變引數
1.的一般用法 define str s s define cons a,b int a e b int main 2.接受,列印可變引數 參考 glibc庫的bebug函式 define printf fmt,args.printf fmt,args 使用方法 define pr debug fm...