C語言可變引數函式怎麼寫?

2021-08-11 20:50:43 字數 719 閱讀 8277

這裡的可變引數指的是引數的個數和型別不確定,

比如我們熟悉的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...