练习 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;
}
posted on 2011-03-12 22:25
小阮 阅读(327)
评论(0) 编辑 收藏 引用 所属分类:
C++程序设计语言