void error(int severity...)
{
va_list ap;
va_start(ap,severity);
for(;;)
{
char* p=va_arg(ap,char*);
if(p==0) break;
cerr<<p<<' ';
}
va_end(ap);
cerr<<'\n';
if(severity) exit(severity);
}
首先,通过调用va_start定义并初始化一个va_list,宏va_start以一个va_list的名字和函数的最后一个有名形参的名字作为参数。宏va_arg用户按顺序取出各个无名参数。在每次调用va_arg时,程序员都必须提供一个类型,va_arg假定这就是被传递的实际参数的类型,但一般说它并没有办法保证这一点。从一个使用过va_start的函数退出之前,必须调用一次va_end,这是因为va_start可能以某种形式修改了堆栈,这种修改可能导致返回无法完成,va_end能将有关的修改复原。