這裡的可變引數指的是引數的個數和型別不確定,
比如我們熟悉的printf,原型是int printf(const char *format, ...);
那麼我們自己怎麼實現呢?比如我寫個函式名叫foo,參考printf寫成如下格式,
void foo(const char *fmt,...)
然後我們需要使用stdarg.h這個標頭檔案裡的va_start,va_end這兩個巨集
我們寫成這樣
void foo(const char *fmt,...)
va_start目的是用fmt來初始化ap。往後對可變引數的挨個獲取,可以使用巨集va_arg對ap進行操作來實現。
如果我們不想乙個乙個獲取,就想獲取可變引數拼接成的字串,如printf輸出到標準輸出的結果那樣。
那麼我們需要借助vsnprintf這個函式,定義在stdio.h裡。
我們寫成這樣
void foo(const char *fmt,...)
; vsnprintf(string,strlen(string)-1,fmt,ap);
va_end(ap);
printf("%s",string);
}
可變引數的用法就是這麼的簡單,快來試試吧。
C語言怎麼實現可變引數?
摘要 c語言使用可變引數,需要借助巨集。這些巨集定義在stdarg.件。stdarg.h宣告了乙個型別va list和三個巨集va start,va arg,va end。include va list v arg 定義乙個型別 va start v arg,len 引數列表初始化 va arg v...
C語言函式可變引數
翻apue的時候,看到了一組可變引數的巨集就是va list 類似 void print arg int count,1 va list變數 ifdef m alpha typedef struct va list else typedef char va list 這個 endif 2 intsi...
C語言可變引數函式
今天在c和指標書中第一次接觸到這個函式,以前有碰到過這樣可變引數的問題,但無從下手。原來c語言還是有這樣的功能,感覺c真是無所不能。c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg pt...