在 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..
可變參數是由 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。
沒有留言:
張貼留言