2009年2月11日星期三

C语言可变长参数处理小结

提问:封装一个可变长参数函数func, 将函数的的可变长参数传递给另外一个可变长参数函数(例如printf)
回答:
(1) 例如在printf 这样的可变长参数函数外再次封装, 并无简单的方法可以直接传递可变长参数。
假设封装函数形式为 func(char* fmt, ...) // fmt只是一个例子,c语言要求可变长参数函数至少有一个固定参数。
则func的变长参数序列可以使用va_start取出 一个va_list 型的参数列,
需要将 传递给 printf的可变参数输出到一个buffer中,然后直接printf(buf)

范例程序如下

#include
#include
void myprint(const char *fmt,...)
{
va_list vs;
char buf[256];

va_start(vs,fmt);
vsprintf(buf,fmt,vs);
printf(buf);
va_end(vs);
}

(2)违反规定的使用其他能够接受 va_list 作为参数的函数来替代 printf
当然这个已经不是我们所想做的了。

没有评论: