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);
}
首先,通過(guò)調(diào)用va_start定義并初始化一個(gè)va_list,宏va_start以一個(gè)va_list的名字和函數(shù)的最后一個(gè)有名形參的名字作為參數(shù)。宏va_arg用戶按順序取出各個(gè)無(wú)名參數(shù)。在每次調(diào)用va_arg時(shí),程序員都必須提供一個(gè)類型,va_arg假定這就是被傳遞的實(shí)際參數(shù)的類型,但一般說(shuō)它并沒(méi)有辦法保證這一點(diǎn)。從一個(gè)使用過(guò)va_start的函數(shù)退出之前,必須調(diào)用一次va_end,這是因?yàn)関a_start可能以某種形式修改了堆棧,這種修改可能導(dǎo)致返回?zé)o法完成,va_end能將有關(guān)的修改復(fù)原。