/*
 * main.c
 *  通过可变数目变量计算1/2+1/2^2+1/2^3...的值
 *  Created on: Oct 29, 2010
 *      Author: jenson
 */

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

double sum_series(int num,...);
int main(){
    double sum = sum_series(4,0.5,0.25,0.125,0.0625);
    printf("sum = %f",sum);
    return 0;
}

double sum_series(int num,...){
    double d;
    double sum = 0.0,t;
       va_list argptr;//定义参数变量
       va_start(argptr,num);

       //计算数列之和
       for(;num>0;num--){
           t = va_arg(argptr,double);
           sum  = sum +t;
       }
       va_end(argptr);
       return sum;
}

上面的代码通过使用宏:
type va_arg(va_list argptr,type);
void va_end(va_list,argptr);
void va_start(va_list,last_parm);
来实现可变参数的使用。

创建一个能够获取可变数目的参数函数的通用过程如下:
  1. 在函数中定义,可变参数表之前必须有一个或多个已知的参数,其中最后者为last_parm。
  2. 在调用va_start()时,last_parm名被用作第二个参数。
  3. 使用任何可主变长度参数函数被访问之前,必须先用va_start()初始化变元指针argptr。
  4. 经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。
  5. 最后取完所有参数并从函数返回之前,必须调用va_end(),由此确保堆栈的正确恢复。
注意:如果未正确使用va_end(),程序可能瘫痪。