可变参数的实现

可变参数的实现
    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能将有关的修改复原。

你可能感兴趣的:(可变参数的实现)