可变参数列表式通过宏来实现的,宏定义在 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_argva_end使用前,必须使用va_start初始化。

[*] type va_arg(va_list ap, type)

       va_arg宏用来获得下一个参数的值,type为该参数的类型,它的参数ap必须被va_start初始化,通过该宏后,返回参数值并使用ap指向下一个参数,以供va_arg再次使用。如果没有下一个参数时调用va_argarg指定的类型不兼容时,会产生可知的错误。

[*]void va_end(va_list ap)

         va_endva_start必须要同一函数里面对称使用,调用va_start(ap,last)ap得到初始化,在完成参数处理后,需要调用va_end(ap)释放”ap   

例:获取参数中最大的整数

   
   
   
   
  1. /** 
  2.  * 检查任意数目的×××参数,并返回最大值 
  3.  */ 
  4. #include  
  5. #include  
  6.  
  7. int max_list( int num , ... ); 
  8.  
  9. int main() 
  10.     int num  = 3;   // 指定有多少个参数 ,在可变参数函数中,参数的个数一定要指定 
  11.     int int_arg1 = 10; 
  12.     int int_arg2 = 25; 
  13.     int int_arg3 = 56; 
  14.     int max_value ; 
  15.      
  16.     max_value = max_list( num ,int_arg1 ,int_arg2 ,int_arg3 ); 
  17.  
  18.     printf("最大值为:%d\n",max_value); 
  19.     return 1; 
  20.  
  21. int max_list( int num , ... ) 
  22.     va_list var_arg;  
  23.     int max_value = 0 ,temp; 
  24.  
  25.     //初始化可变参数 
  26.     va_start( var_arg , num );
  27.  
  28.     //获取最大整数值 
  29.     while( --num >= 0 ){ 
  30.         temp = va_arg( var_arg , int ); //遍历所有可变参数 
  31.         if(max_value < temp)
  32.             max_value = temp; 
  33.     } 
  34.  
  35.     // 释放var_arg  与 va_start 对称出现 
  36.     va_end(var_arg); 
  37.  
  38.     return max_value; 

本文参考 《亲密接触c可变参数函数》

 

vim 7.3

gcc 版本 : 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)  
system : Fedora 14