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