可变参数列表式通过宏来实现的,宏定义在 stdarg.h头文件中,该头文件声明了一个类型va_list 和三个宏 。
提供的三个宏分别如下:
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
这种隐式的数据类型是va_list。
上面宏的前缀va表示variable argument,即可变参数的意思。变量ap专门用来记录获取可变参数。下面依次介绍三个宏的意义和用法。
[*] void va_start( va_list ap, last)
last为函数形参中"..."前的最后一个形参名字,宏va_start用于根据last的位置(或指针)来初始化变量ap,以供宏ar_arg来依次获得可变参数的值。变量ap在被va_arg或va_end使用前,必须使用va_start初始化。
[*] type va_arg(va_list ap, type)
va_arg宏用来获得下一个参数的值,type为该参数的类型,它的参数ap必须被va_start初始化,通过该宏后,返回参数值并使用ap指向下一个参数,以供va_arg再次使用。如果没有下一个参数时调用va_arg或arg指定的类型不兼容时,会产生可知的错误。
[*]void va_end(va_list ap)
宏va_end与va_start必须要同一函数里面对称使用,调用va_start(ap,last)后ap得到初始化,在完成参数处理后,需要调用va_end(ap)来“释放”ap。
例:获取参数中最大的整数
- /**
- * 检查任意数目的×××参数,并返回最大值
- */
- #include <stdio.h>
- #include <stdarg.h>
- int max_list( int num , ... );
- int main()
- {
- int num = 3; // 指定有多少个参数 ,在可变参数函数中,参数的个数一定要指定
- int int_arg1 = 10;
- int int_arg2 = 25;
- int int_arg3 = 56;
- int max_value ;
- max_value = max_list( num ,int_arg1 ,int_arg2 ,int_arg3 );
- printf("最大值为:%d\n",max_value);
- return 1;
- }
- int max_list( int num , ... )
- {
- va_list var_arg;
- int max_value = 0 ,temp;
- //初始化可变参数
- va_start( var_arg , num );
- //获取最大整数值
- while( --num >= 0 ){
- temp = va_arg( var_arg , int ); //遍历所有可变参数
- if(max_value < temp)
- max_value = temp;
- }
- // 释放var_arg 与 va_start 对称出现
- va_end(var_arg);
- return max_value;
- }
本文参考 《亲密接触c可变参数函数》
vim 7.3
gcc 版本 : 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
system : Fedora 14
转载于:https://blog.51cto.com/strugglelinux/537789