对于可变参数的函数,需要进行特殊的处理。首先需要引用 <stdarg.h> 头文件,然后利用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。
这几个宏的定义如下(在 ANSI C 中):
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr, prev_param );
直接看代码吧,很好理解。该例子实现了一个简单的类似printf函数的功能。
string myprint(char *str, ...)
{
string printstr;
int len = strlen(str);
char *pos1 = str, *pos2 = str;
char tmpstr[256];
va_list pArg;
va_start(pArg, str);
while((pos2 = strchr(pos1, '%')) != NULL){
memcpy(tmpstr, pos1, pos2 - pos1);
tmpstr[pos2 - pos1] = 0;
printstr += tmpstr;
switch(pos2[1]){
case 'd':
sprintf(tmpstr, "%d", va_arg(pArg, int));
printstr += tmpstr;
break;
case 's':
sprintf(tmpstr, "%s", va_arg(pArg, char*));
printstr += tmpstr;
break;
case 'x':
sprintf(tmpstr, "%x", va_arg(pArg, int));
printstr += tmpstr;
break;
case 'c':
sprintf(tmpstr, "%c", va_arg(pArg, char));
printstr += tmpstr;
break;
case 'p':
sprintf(tmpstr, "%p", va_arg(pArg, char));
printstr += tmpstr;
break;
default:
break;
}
pos1 = pos2 + 2;
}
printstr += pos1;
return printstr;
}