Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966265
  • 博文数量: 184
  • 博客积分: 10030
  • 博客等级: 上将
  • 技术积分: 1532
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-27 18:32
文章分类

全部博文(184)

文章存档

2009年(1)

2008年(63)

2007年(39)

2006年(79)

2005年(2)

我的朋友

分类: C/C++

2008-05-12 17:29:03

宏va_arg()、va_start()和va_end()一起使用,便可以完成向函数传入数目可变的变元操作。取可变数目变元的典型例子是函数printf()。
类型va_list是在中定义的,上述的宏原型如下所示:
      type va_arg(va_list argptr, type);
      void va_end(va_list argptr);
      void va_start(va_list argptr, last_parm);
它们都包含在头文件中。
创建一个能获取可变数目变元的函数的通用过程:在函数定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_parm。在调用va_start()时,last_parm名被用作第二个参数。
使用任何可变长度的变元被访问之前,必须先用a_start()初始化变元指针argptr。初始化argptr后,经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。最后取完所有参数并从函数返回之前。必须调用a_end(),由此确保堆栈的正确恢复,如果未正确使用va_end(),程序可能瘫痪。
例子:
用sum_series()求一系列的总和,sum_series()的第一个变元是数列项目数。本程序是求以下数列的前四项之和:
1/2+1/(2*2)+1/(2*2*2)...............
#include
#include
double sum_series(int num, ...);
int main()
{
double d;
d= sum_series(4, 0.5, 0.25, 0.125, 0.06254);
printf("Sum of series is %f.\n", d);
return 0;
}
double sum_series(int num, ...)
{
double sum= 0.0, t;
va_list argptr;
va_start(argptr, num);
for(; num; num--)
{
  t= va_arg(argptr, double);
  sum= sum+ t;
}
va_end(argptr);
return sum;
}
阅读(1225) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~