ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年9月1日 星期四

variable argument list

就是像 printf 一樣的可變個數的參數列。
在 wikipedia 裡說明得很清楚。
printf(const char *fmt,...)
後面的三個 ... 就代表參數個數可變。

可變參數是由 compiler 實做的,在C99 後引入 _VA_ARGS_ 這個 MACRO,用來代表這個功能。
http://en.wikipedia.org/wiki/Variadic_macro

實際implement 這類function 時,利用 va_start,  va_arg, va_end 依序取出參數列內的參數。

但是要作一個 var agumet 的 wrapper function 就麻煩了。
所以 variable argument 的 function 都實做兩個版本:
printf ---> vprintf
sprintf --> vsprintf.

一個是 直接使用 var argument 作為 interface,一個用 va_start 取出的 argument array pointer 作為參數。
所以要作一個 wrapper function 時,就要用 va_start( ) 取出 argument array pointer,再呼叫 v 字頭的 function..
void myprintf(const char *fmt,...) { va_list ap; va_start(ap,fmt); vprintf(fmt,ap); va_end(ap); } --- 用 vprintf,不是 printf。

沒有留言:

標籤

網誌存檔