????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ù)原。