#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; }