可选性自变量

来源:互联网 发布:mac android 文件传输 编辑:程序博客网 时间:2024/04/20 11:25
C语言允许定义自变量数量可变的函数,这称为Variadic函数。
 
这样的函数需要固定数目的强制性自变量(mandatory argument),后面是数量可变的可选性自变量。这种函数必须有“至少一个”强制性自变量。可选性自变量的类型可能会变,其数量可能由“强制性自变量的值”决定,或者由“用来定义可选性自变量列表的特殊值”决定。
 
C语言中最有名的variadic函数是printf()和scanf()。这两个variadic函数都一个强制性自变量,也就是格式化字符串;格式化字符串的转化修饰符聚顶可选性自变量的数量和类型。
 
对于一个强制的变量来说,函数头会显示一个适当的参数,像一般的函数声明一样。参数列表的规格是强制性参数在前,后面跟着一个逗号和省略号,这个省略号就代表可选性自变量。
 
variadic函数要存取可选性自变量时,必须通过一个类型为va_list的对象,它包含了自变量的信息。这种类型的对象也称为“自变量指针”(argument point),它最少包含此堆栈中一个自变量的位置。可以使用这个自变量指针迁移到下一个可选性自变量,如此,函数就可以存取所有的可选性自变量。va_list类型被定义在stdarg.h中。
 
编写支持“可选性自变量”的函数时,必须使用va_list类型定义变量指针,以存取可选性自变量;可以用四个宏来处理此变量指针,这四个宏也被定义在stdarg.h中。
 
void va_start( va_list argptr, lastparam );
    va_start使用第一个可选性自变量初始化argptr,lastparam必须是“此函数最后一个有名字的参数”的名称。开始使用可选性自变量之前,必须调用此宏。
 
type va_arg( va_list argptr, type );
    va_arg会取得目前argptr所指的可行性自变量,也会将argptr前移到下一个自变量。type是“刚刚读入”的自变量的类型。
 
void va_end( va_list argptr );
    当不再需要自变量指针时,必须使用该宏。如果想使用va_start或va_copy来重新初始化一个之前用过的自变量指针,也得先调用va_end。
 
void va_copy( va_list dest, va_list src );
    va_copy使用目前的src来初始化dest。
 
下面给一个演示这些宏的使用方法
  1. //double add( int n, ... ) 累加可选性自变量的函数 
  2. //自变量:n:可选性自变量的数目 
  3. //        可选性自变量的类型是double 
  4. //返回值:累加和,类型是double 
  5. double add( int n, ... )
  6. {
  7.     int i = 0;
  8.     double sum = 0;
  9.     va_list argptr; //声明argptr 
  10.     va_start( argptr, n ); //初始化argptr 
  11.     for ( i = 0; i < n; ++i ) //对每个可选性自变量 
  12.         sum += va_arg( argptr, double ); //读取类型为double的自变量 
  13.     va_end( argptr ); //累加 
  14.     teturn sum;
  15. }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     
      
     
原创粉丝点击