声明这些函数的方式是在参数表最后用省略号(...)结束
如 int printf(const char* format, ...){}
要解析函数的参数需要用到va_list,声明一个va_list,然后使用宏va_start定义并初始化va_list,再通过宏va_arg按顺序提取出各个无名参数,每次调用va_arg,都需要提供一个类型(va_arg会假定这就是被传递参数的实际类型,但是它并不保证其正确性),最后需要调用一次va_end,因为va_start可能修改了堆栈,必须使用va_end将这些修改还原。
代码例子
void print(const char *format, ...)
{
va_list arg; __crt_va_start(arg, format);
while(*format)
{
char ret = *format;
if(ret == '%')
{
switch (*++format)
{
case 'c':
{
char ch = __crt_va_arg(arg, char);
putchar(ch);
break;
}
default:
break;
}
}
else
{
putchar(*format);
}
format++;
} __crt_va_end(arg);
}