变参函数

/****************************
* 文件名:  变参函数
* 创建人: 陈泽丹
* 创建时间:20100908
* 版本号:  1.0
****************************/


#include <iostream>
#include <stdarg.h> //变参函数所需头文件

using namespace std;

/* 宏定义
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )   
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址   
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址   
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
*/

double sum_byValue(int num,...)
{//变参函数:值传递
 double sum = 0.0;
 double* t;
 va_list argptr; //定义栈
 va_start(argptr,num); //获得第一个可变参数的位置(必须有至于一个固定参数以便通过它获得第一个可变参数的地址)
 for(int i=0; i<3; i++)
 {
  t = &va_arg(argptr,double); //获得第一个可变参数,并且指针下移
  sum += *t;
 }
 va_end(argptr); //消除栈
 return sum;
}

void byAddress(int num,...)
{//变参函数:指针传递
 va_list argptr; //定义栈
 va_start(argptr,num); //获得第一个可变参数的位置(必须有至于一个固定参数以便通过它获得第一个可变参数的地址)
 double* pD = va_arg(argptr,double*); //获得第一个可变参数,并且指针下移
 *pD = 4;
 int* pI = va_arg(argptr,int*); //获得第一个可变参数,并且指针下移
 *pI = 5;
 va_end(argptr); //消除栈
}

void main()
{
 cout<<sum_byValue(0,1.3,2.2,3.2)<<endl;

 double a=1;
 int b=2;
 byAddress(0,&a,&b);
 cout<<a<<","<<b<<endl;

 system("pause");
}

你可能感兴趣的:(变参函数)