為函式設定“動態引數”
阿新 • • 發佈:2019-01-29
#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語言的方式來實現。