C++不定參數綜合實例

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章