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能將有關的修改復原。