下面,我們來看一下,如果在c++的函式中接收數量不定的函式引數。這種形式如同在c#的函式引數列表中使用params 型別的引數。
我們可以將函式定義成能夠接受任意數量的實參。通過將省略號(3個句點...)寫在函式定義中形參列表的最後,即可表示呼叫該函式時可以提供數量可變的實參。例如:
int sumvalues(int first,...)
函式定義中必須至少有乙個普通形參,但也可以有多個。省略號必須總是放在形參列表的最後。
顯然,定義中沒有關於可變列表中實參的型別或數量的任何資訊,因此我們的函式**必須弄清楚自己被呼叫時接收的是什麼。本地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《本例結果:
1055
按任意鍵繼續。。。
示例說明
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將指向某個不包含有效資料的儲存單元。
接收數量不定的函式實參
include include using std cout using std endl int sum int count,第乙個為計數引數 if count 0 return 0 處理可變的引數列表 va list arg ptr 宣告乙個va list型別的指標 va start arg p...
Python中的不定數量的函式引數
首先並不是必須寫成 args 和 kwargs。只有變數前面的 星號 才是必須的,不過更建議使用這兩個名字,可以讓別的程式設計師更容易理解。args是用來傳送乙個非鍵值對的可變數量的引數列表給乙個函式。def var args f arg,args print first arg f arg for...
c 中如何寫引數不定的函式
作為va list,va start的練習,可以學習一下使用 vsnprintf函式 include stdio.h include stdarg.h void formatoutput char format,void main 引數個數不定的函式,最頻繁使用的就是printf 與scanf 其實...