Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88252
  • 博文数量: 60
  • 博客积分: 4002
  • 博客等级: 中校
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 18:11
文章分类

全部博文(60)

文章存档

2011年(60)

我的朋友

分类: C/C++

2011-01-01 16:01:48

    标准头文件 中包含了一组宏定义,它们对如何遍历参数表进行了定义。 该头文件的实现因不同的机器而不同, 但提供的接口是一致的。

    va_list 类型用于声明一个变量, 该变量将依次引用各参数。

    va_start宏用于将va_list类型的变量初始化为指向第一个无名参数的指针。在使用变量之前va_start宏必须被调用一次。参数表必须至少包含一个有名参数,va_start将最后一个有名参数作为起点。

    va_arg的参数为va_list类型的变量和要返回的类型,返回值为一个参数,并将变量指向下一个参数。

    va_end用于函数返回之前的一些必要的清理工作。

例如:


  1. #include <stdio.h>
  2. #include <stdarg.h>

  3. void miniPrintf(char *fmt, ...);

  4. int
  5. main(int argc, char **argv)
  6. {
  7.     int     a    =    1;
  8.     double    b    =    2.0;
  9.     char    *s    =    "Hello";

  10.     miniPrintf("Result: %s, %d and %f\n", s, a, b);

  11.     return 0;
  12. }

  13. void miniPrintf(char *fmt, ...)
  14. {
  15.     va_list    ap;    /* */
  16.     char     *p, *sval;
  17.     int     ival;
  18.     double     dval;

  19.     va_start(ap, fmt);
  20.     for (p = fmt; *p; p++) {
  21.         if (*p != '%') {
  22.             putchar(*p);
  23.             continue;
  24.         }

  25.         switch (*++p) {
  26.             case 'd':
  27.                 ival = va_arg(ap, int);
  28.                 printf("%d", ival);
  29.                 break;
  30.             case 'f':
  31.                 dval = va_arg(ap, double);
  32.                 printf("%f", dval);
  33.                 break;
  34.             case 's':
  35.                 for (sval = va_arg(ap, char *); *sval; sval ++) {
  36.                     putchar(*sval);
  37.                 }
  38.                 break;
  39.             default :
  40.                 putchar(*p);
  41.                 break;
  42.         }
  43.     }
  44.     va_end(ap);
  45. }
阅读(391) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:strlen

给主人留下些什么吧!~~