c++ 不定引數**)
**:下面,我們來看一下,如果在c++的函式中接收數量不定的函式引數。這種形式如同在c#的函式引數列表中使用params 型別的引數。
我們可以將函式定義成能夠接受任意數量的實參。通過將省略號(3個句點…)寫在函式定義中形參列表的最後,即可表示呼叫該函式時可以提供數量可變的實參。例如:
int sumvalues(int first,…)
//code for the function
函式定義中必須至少有乙個普通形參,但也可以有多個。省略號必須總是放在形參列表的最後。
顯然,定義中沒有關於可變列表中實參的型別或數量的任何資訊,因此我們的函式**必須弄清楚自己被呼叫時接收的是什麼。本地c++庫在stdarg.h標頭檔案中定義了va_start、va_arg、和va_end巨集,以幫助我們做這件事。用示例來說明其用法是最容易的。
#include
#include 「stdarg.h」
using namespace std;
int sum(int count,…)
{if(count<=0)
return 0;
va_list arg_ptr;
va_start(arg_ptr,count);
int sum = 0;
for (int i=0;iint main()
{cout《本例結果:
按任意鍵繼續。。。
示例說明
main()函式函式在兩條輸出語句中呼叫了sum()函式,第一次有6個實參,第二次有9個實參。
sum()函式有乙個int型別的普通形參,它表示後面跟著的實參的數量。形參列表中的省略號表明可以傳遞任意數量的實參。基本上,我們有兩種方法來確定呼叫該函式時有多少實參:第一是像sum()函式一樣,用某個固定的形參指定實參的數量;第二是要求最後乙個實參具有特殊的標記值,以便我們進行檢查和確認。
為了開始處理可變的實參列表,我們首先宣告乙個va_list型別的指標:
va_list arg_ptr;
va_list 型別是在stdarg.h標頭檔案中定義的,該指標用來依次指向各個實參。
va_start巨集用來初始化arg_ptr,使其指向列表中的第乙個實參:
va_start巨集用來初始化arg_ptr,使其指向列表中的第乙個實參:
va_start(arg_ptr,count);
這個巨集的第二個實參是函式形參列表中活力號前面固定形參的名稱,用來確定第乙個可變實參的位置。
我們在for迴圈中取出列表中各個實參的值:
for (int i=0;ivar_arg巨集返回arg_ptr指向的位置儲存的實參值,並使arg_ptr遞增,以指向下乙個實參值。va_arg巨集的第二個實參是第乙個實參的型別,決定著我們得到的數值以及va_arg遞增的方式,因此如果該實參不正確,將造成混亂。程式也許會執行,但我們得到的數值將是無用資料,而且arg_ptr將被錯誤地遞增,從而指向另外的無用資料。
當結束檢索實參值之後,我們用下面這條語句使arg_ptr復位:
va_end(arg_ptr);
va_end巨集將我們傳遞給它的實參–va_list型別的指標復位成空值。始終這樣做是個好主意,因為在處理過實參之後,arg_ptr將指向某個不包含有效資料的儲存單元。
c 不定引數
va list vlist va start vlist,pszformat pszformat 表示 的前乙個引數 va end vlist 其中 typedef char va list define va start crt va start define va arg crt va arg ...
C語言不定引數
最近,遇到乙個c語言的不定引數問題。其實,對於c語言的不定引數問題,只需要三個函式就可以搞定了。這三個函式的標頭檔案是,其實下面的三個函式都是乙個巨集定義 macro 這三個函式是 void va start va list ap,last type va arg va list ap,type v...
C 不定個數引數寫法
有時候需要寫不定個數引數的函式。就像c語言的sprintf函式。函式申明方法是比較固定的 return type functionname type t1 比如 void fun int printf const char format,省略號的位置就是不定個數的引數列表了。接下來,給出常見的3種寫...