可以将函数定义成能够接受任意数量的实参。通过将省略号(3个句点...)写在函数定义中形参列表的最后,即可表示调用该函数时可以提供数量可变的实参。例如
int sumValues( int first, ... )
{
// Code for the function
}
函数定义中至少有一个普通形参,也可以有多个。省略号必须放在形参列表的最后。
显然定义中没有关于可变列表中实参的类型或数量的任何信息,因此我们的函数代码必须弄清自己被调用时接收的事什么。 C++库在 stdarg.h 头文件中定义了va_start、va_arg、va_end宏,可以帮助我们做这件事。
如下程序
#include<iostream>
#include<cstdarg>
using namespace std;
int sum( int count, ... )
{
if( count <= 0 )
return 0;
va_list arg_ptr; // Declare argument list pointer
va_start( arg_ptr , count ); // Set arg_ptr to 1st argument
int sum = 0;
for( int i=0; i<count; i++ )
sum += va_arg( arg_ptr, int ); // Add int value from arg_ptr and increment
va_end( arg_ptr ); // Reset the pointer to null
return sum;
}
int main( )
{
cout << sum( 6, 2, 4, 6, 8, 10, 12 ) <<endl;
cout << sum( 9, 11, 22, 33, 44, 55, 66, 77, 88, 99 );
system("pause");
return 0;
}
运行结果42
472
main()函数在两条输出语句中调用了sum( )函数,第一次6个实参、第二次9个实参 ,每种情况下的第一个实参都指定跟着的实参个数。
sum() 函数有一个int类型的普通参数,他表示后面跟着的实参的数量。形参表中的省略号表明可以传递任意数量的实参。有2种方法可以确定调用该函数时有多少实参:第一是像sum()函数一样,用一个固定的形参指定实参的数量;第二是要求最后一个实参具有特殊的标记值,以便进行检查和确认。
接下来再对程序语句进行分析。
va_list arg_ptr; 声明一个va_list 类型的指针, va_list 类型在stdarg.h头文件中定义的,该指针用来依次指向各个实参。
va_start( arg_ptr , count ); va_start 宏用来初始化arg_ptr,使其指向列表中第一个实参。
for( int i=0; i<count; i++ )
sum += va_arg( arg_ptr, int ); 宏 va_arg返回 arg_ptr指向的位置存储的实参值,并使arg_ptr递增,指向下一个实参值。 宏va_ptr的第二个实参是第 一个实参的类型,决定着我们得到的数值以及va_arg 递增的方式。
va_end( arg_ptr ); 宏va_end 将传递给他的实参——va_list 类型的指针复位成空值