#include <conio.h>
#include <stdarg.h>
#include <iostream>
using namespace std;
/************************************************************************/
/*
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
都包含在头文件<stdarg.h>中
任何可变长度的变元被访问之前,必须先用va_start()初始化变元指针argptr
#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 ) // 将指针置为无效
*/
/************************************************************************/
void test()
{
double a;
a = 1.1;
int b = *(int*) & a;
cout << (void*)&a << " " << (void*)&b << endl;
}
int sum(int i,...)
{
int count;//参数个数
int ra;
int inst;
va_list markr;
va_start(markr, i);//获取地址
ra = (*(int *)((int)markr - 8));//获得栈顶返回值
inst = (*(int *)(*(int *)((int)markr - 8)));//获取指令
count = ((inst&0xff0000)>>16)/4;//得到参数个数
cout << "参数个数是:" << count << endl;
va_end(markr);//释放
va_list arg_ptr;
va_start(arg_ptr, i);
int* first;
first = &i;
int m;
m =* first;//首先把第一个参数加上
int j=0;
while (1)
{
if(j >= (count-1))
break;
m+=va_arg(arg_ptr, int);
//这里 va_arg(arg_ptr, int)是从第二个参数开始递加返回
j++;
}
va_end (arg_ptr);
return m;
}
int sumi(int val, ...)
{
va_list ap;
va_end(ap);//置空
cout << "ap=" << (void*)ap << endl;
cout << "&val=" << (void*)&val << endl;
va_start(ap,val);//va_start执行完毕后,ap指向变量val后第一个4字节对齐的地址
cout << "va_start(ap,val)=" << (void*)va_start(ap,val) << endl;
int sum = val;
cout << "sum=" << sum << endl;
cout << "ap=" << (void*)ap << endl;
val = va_arg(ap, int);//使ap指向当前变量的下一个变量
cout << "ap=" << (void*)ap << endl;
while(0 != val)
{
sum = sum + val;
val = va_arg(ap,int);
}
return sum;
}
int maxi(int val, ...)
{
va_list vl;
va_start(vl, val);//va_start执行完毕后,vl指向变量val后第一个4字节对齐的地址
int max = val;
int inst = (*(int *)(*(int *)((int)vl - 8)));//获取指令
int count = ((inst&0xff0000)>>16)/4;//得到参数个数
for (int i = 0; i < count-1; i++)
{
val = va_arg(vl, int);//使vl指向当前变量的下一个变量
//cout << val << endl;
if (val > max)
{
max = val;
}
//cout << "max: " << max << endl;
}
va_end(vl);//置空vl
return max;
}
int fun2(const char *ch,int num,...)
{
va_list ap;
va_start(ap,num);
va_list app = va_arg(ap, va_list);//获取下一层参数
cout << ch << endl;
for(int i=0;i<num;i++)
{
int t = va_arg(app,int);
cout << t << " ";
}
cout << endl;
va_end(ap);
return 0;
}
int fun1(const char *ch,int num,...)
{
va_list ap;
va_start(ap,num);
//不定参数之间之间传递参数
fun2(ch,num,ap);
va_end(ap);
return 0;
}
int main(int argc, char* argv[])
{
//这里的sum参数可以任意个
cout << sum(35,40,20,10,100,1,2,3,4,10,20,30,40) << endl;
cout << sumi(35,40,20,10,100,1,2,3,4,10,20,30,40,0) << endl;
cout << "max(35,40,20,10,100,1,2,3,4,10,20,30,40) = " << maxi(35,40,20,10,100,1,2,3,4,10,20,30,40) << endl;
fun1("Hello ",6,2,4,3,6,8,9);
test();
getch();
return 0;
}
C++不定参数综合实例
最新推荐文章于 2024-04-19 11:19:25 发布