C++不定参数综合实例

来源:互联网 发布:java源程序的扩展名是 编辑:程序博客网 时间:2024/04/30 09:39
#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);//置空vlreturn 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;}

原创粉丝点击