函數可有未知數目和 type 的引數。
#include <stdarg.h>
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);
首先宣告一個 va_list 物件,然後使用 va_start() 初始化物件,和 va_end() 成對使用,之間用 va_arg()、或 vprintf() 等使用 va_list 物件。
va_arg() 將第一個引數定義為 type 後指到下個引數。
#include <stdarg.h>
void my_printf(const char *fmt, ...)
{
va_list ap; //宣告一個 va_list 物件 ap
va_start(ap, fmt); //初始化 ap
vprintf(fmt, ap); //使用 ap 並更新指到下個未用的引數
va_end(ap); //結束 ap
}
va_list 最普遍是一個指標指到函數的 stack frame,複製可以直接指定:
va_list aq = ap
但也有系統是一個陣列,內容是一個指標,需要:
va_list aq; *aq = *ap;
另外,argument 如果是透過暫存器傳遞的系統,va_start() 需要配置記憶體存 arguments 和指示哪個是下個 argument,va_end() 可以釋出配置的記憶體。
因應不同情況, C99 新增 va_copy(),複製變成:
va_list aq; va_copy(aq, ap); ... va_end(aq);
沒有留言:
張貼留言