练习 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
小阮 阅读(334)
评论(0) 编辑 收藏 引用 所属分类:
C++程序设计语言