可变参数.

可变参数.
练习 7.11
      写一个error函数,它取一个printf风格的包含%s、%c和%d指示符的格式串, 以及任意多个其他参数。请不要使用printf()。

解:
      对于变动长度参数表的处理通过一些很像对待器的设施完成,这类设施的类型为va_list。宏va_start对这类设施进行初始化,还必须用宏va_end指明这种设施不会再用。要取得当前参数的值并将该设施移到下一个参数, 需要用va_arg。参数表的结束必须能从至今已经看到的实际参数确定(典型情况下,函数从没有省略号表示的某个常规参数哪里获得有关信息。)

#include  < cassert >
#include 
< cstdarg >
#include 
< iostream >
#include 
< stdexcept >

using   namespace  std;

void  error( char   const   *  fmt, ) {
        assert(fmt);
        va_list p;
        va_start(p, fmt);
        
for(char const *s=fmt; *s; ++s)
                
if(*s!='%')
                        cerr.put(
*s);
                
else
                        
switch(*(++s)){
                        
case '%': cerr.put('%'); break;
                        
case 's': cerr<<va_arg(p, char const *); break;
                        
case 'c': cerr<<(char)va_arg(p, int); break;
                        
case 'd': cerr<<va_arg(p, int); break;
                        
default:
                                
throw domain_error("error");
                        }

        va_end(p);
}


int  main() {
        error(
"A string \"%s\", a single character \'%c\', an integer %d\n","Hello World"'$'12345);
        
return 0;
}

       

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