1.1简单介绍
在C语言中,不但参数的类型可变,参数的个数也是可变的.也就是说,在形参表中可以不明确指定传递参数的个数和类型,一个常见的库函数Printf()就是如此.这种函数称之为变参函数。可变长参数函数的参数数目和类型虽然是可变,但其设计原理与固定参数函数的设计原理是一致的,必须有办法告诉变参函数没有指定的参数的个数和类型。
1.2可变长参数函数的设计方法
在标准文件stdarg.h中包含带参数的宏定义
C++ Code
typedef void *va_list
#define va_arg(ap,type) (*((type *)(ap))++)
#define va_start(ap,lastfix) (ap=…)
#define va_end(ap)
(1)可变长参数函数用规定格式定义为“类型函数名(firstfix,…,lastfix,…)”.firstfix,…,lastfix表示函数参数列表中的第一个和最后一个固定参数,该参数列表中至少要有一个固定参数,其作用是为了给变参函数确定列表中参数的个数和参数的类型.
(2)指针类型va_list用来说明一个变量ap(argumentpointer——可变参数指针),此变量将依次引用可变参数列表中用省略号“…”代替的每一个参数.即指向将要操作的变参.
(3) 宏va_start(ap,lastfix)是为了初始化变参指针ap,以指向可变参数列表中未命名的第一个参数,即指向lastfix后的第一个变参.它必须在指针使用之前调用一次该宏,参数列表中至少有一个未命名的可变参数.从宏定义可知其正确性.
(4) 宏va_arg(ap,type)调用,将ap指向下一个可变参数,而ap的类型由type确定,type数据类型不使用float类型.如iap=va_start(ap,int)调用.
(5) 宏va_end(ap)从stdarg.h中看出定义为空,即未定义.其功能完成清除变量ap的作用,表明程序以后不再使用,若该指针变量需再使用,必须重新调用宏va_start以启动该变量.
1.3应用举例
变参类型相同的函数
C++ Code
#include
#include
//num个int型数相乘
int mul( int num, int data1, ... )
{
int total = data1;
int arg, i;
va_list ap;
va_start(ap, data1);
for(i = 1; i < num; i++)
{
arg = va_arg(ap, int);
total *= arg;
}
va_end(ap);
return total;
}
//i个int型数相乘
long mul2( int i, ...)
{
int *p, j;
p = &i + 1; //p指向参数列表下一个位置
long s = *p;
for (j = 1; j < i; j++)
s *= p[j];
return s;
}
int main()
{
printf( "%d\n", mul( 3, 2, 3, 5));
printf( "%d\n", mul2( 3, 2, 3, 5));
return 0;
}