/****************************
* 文件名: 变参函数
* 创建人: 陈泽丹
* 创建时间: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");
}
1066

被折叠的 条评论
为什么被折叠?



