标准头文件 中包含了一组宏定义,它们对如何遍历参数表进行了定义。 该头文件的实现因不同的机器而不同, 但提供的接口是一致的。
va_list 类型用于声明一个变量, 该变量将依次引用各参数。
va_start宏用于将va_list类型的变量初始化为指向第一个无名参数的指针。在使用变量之前va_start宏必须被调用一次。参数表必须至少包含一个有名参数,va_start将最后一个有名参数作为起点。
va_arg的参数为va_list类型的变量和要返回的类型,返回值为一个参数,并将变量指向下一个参数。
va_end用于函数返回之前的一些必要的清理工作。
例如:
- #include <stdio.h>
-
#include <stdarg.h>
-
-
void miniPrintf(char *fmt, ...);
-
-
int
-
main(int argc, char **argv)
-
{
-
int a = 1;
-
double b = 2.0;
-
char *s = "Hello";
-
-
miniPrintf("Result: %s, %d and %f\n", s, a, b);
-
-
return 0;
-
}
-
-
void miniPrintf(char *fmt, ...)
-
{
-
va_list ap; /* */
-
char *p, *sval;
-
int ival;
-
double dval;
-
-
va_start(ap, fmt);
-
for (p = fmt; *p; p++) {
-
if (*p != '%') {
-
putchar(*p);
-
continue;
-
}
-
-
switch (*++p) {
-
case 'd':
-
ival = va_arg(ap, int);
-
printf("%d", ival);
-
break;
-
case 'f':
-
dval = va_arg(ap, double);
-
printf("%f", dval);
-
break;
-
case 's':
-
for (sval = va_arg(ap, char *); *sval; sval ++) {
-
putchar(*sval);
-
}
-
break;
-
default :
-
putchar(*p);
-
break;
-
}
-
}
-
va_end(ap);
-
}
阅读(391) | 评论(0) | 转发(0) |