1. 程式人生 > >為函式設定“動態引數”

為函式設定“動態引數”

#include<iostream>
#include<cstdarg>
void ConnectData(int i , ...)
{
	using namespace std;
	va_list ap;
	va_start(ap , i);
	while(i--)
	{
		char* ctemp = va_arg(ap ,char*);
		int itemp = va_arg(ap,int);
		float ftemp = va_arg(ap,double);
		cout<<ctemp<<endl;
		cout<<itemp<<endl;
		cout<<ftemp<<endl;
	}
	va_end(ap);
}

int main()
{
	ConnectData(2 , "明日科技" ,2006 ,7.12 ,"有限公司",54,8.2);
	return 0;
}

VA_LIST的用法:
(1)首先在函式裡定義一具VA_LIST型的變數,這個變數是指向引數的指標;
(2)然後用VA_START巨集初始化變數剛定義的VA_LIST變數;
(3)然後用VA_ARG返回可變的引數,VA_ARG的第二個引數是你要返回的引數的型別(如果函式有多個可變引數的,依次呼叫VA_ARG獲取各個引數);
(4)最後用VA_END巨集結束可變引數的獲取。
使用VA_LIST應該注意的問題:
(1)可變引數的型別和個數完全由程式程式碼控制,它並不能智慧地識別不同引數的個數和型別;
(2)如果我們不需要一一詳解每個引數,只需要將可變列表拷貝至某個緩衝,可用vsprintf函式;
(3)因為編譯器對可變引數的函式的原型檢查不夠嚴格,對程式設計查錯不利.不利於我們寫出高質量的程式碼;

小結:可變引數的函式原理其實很簡單,而VA系列是以巨集定義來定義的,實現跟堆疊相關。我們寫一個可變引數的C函式時,有利也有弊,所 以在不必要的場合,我們無需用到可變引數,如果在C++裡,我們應該利用C++多型性來實現可變引數的功能,儘量避免用C語言的方式來實現。