va_arg ()-va_copy ()-va_end ()-va_start ()- 句柄变量自变量列表

格式

#include <stdarg.h>
var_type va_arg(va_list arg_ptr, var_type);
void va_copy(va_list dest, va_list src);
void va_end(va_list arg_ptr);
void va_start(va_list arg_ptr, variable_name);

语言级别

ANSI

线程安全

描述

va_arg()va_copy()va_end()va_start() 函数采用固定数目的必需自变量和可变数目的可选自变量时,这些函数将访问该函数的自变量。 您将必需参数声明为函数的普通参数,并通过参数名称访问这些参数。

va_start() 初始化 arg_ptr 指针以用于后续调用 va_arg()va_copy()va_end()

自变量 variable_name 是参数列表中最右边指定的参数的标识 (在前面, ...)。 在 va_arg()之前使用 va_start() 。 相应的 va_start()va_end() 宏必须在同一函数中。

va_copy()dest 初始化为 src 的副本,就像 va_start() 已应用于 dest 一样,后跟先前用于达到 src的当前状态的 va_arg() 的使用序列。 对于同一 dest,如果没有对 va_end() 的中间调用,那么将不会调用 va_copy()va_start() 来重新初始化 dest

va_arg() 函数从 arg_ptr给定的位置检索给定 var_type 的值,并增大 arg_ptr 以指向列表中的下一个自变量。 va_arg() 函数可以在该函数中的任意次数从列表中检索自变量。 var_type 参数必须是 int , long , decimal , double , struct , union 或 pointer 中的一个,或者是其中一种类型的 typedef。

需要 va_end() 函数来指示参数扫描结束。 va_start()va_copy() 的每个调用都必须与同一函数中对 va_end() 的相应调用匹配。

因为被调用函数并不总是能确定有多少个自变量,所以调用函数应该将自变量的数目传达给被调用函数。 要确定自变量的数目,函数可以使用空指针来指示列表结束,或者将可选自变量的计数作为其中一个必需自变量传递。 例如, printf() 函数可以通过 format-string 自变量来确定有多少个自变量。

返回值

va_arg() 函数返回当前自变量。 va_copy()va_end()va_start() 函数不会返回值。

示例

此示例将变量数目的自变量传递给一个函数,该函数将每个自变量打印两次。
#include <stdio.h>
#include <stdarg.h>
 
int vout(int max, ...);
 
int main(void)
{
   vout(2, "Sat", "Sun");
   printf("\n");
   vout(3, "Mon", "Tues", "Wed");
}
 
int vout(int max, ...)
{
   va_list arg_ptr;
   va_list args_copy;
   int args;
   char *day;
   va_start(arg_ptr, max);
   va_copy(args_copy, arg_ptr);
   args = 0;
   while(args < max)
   {
      day = va_arg(arg_ptr, char *);
      printf("Day: %s\n", day);
      args++;
   }
   va_end(arg_ptr);

   args = 0;
   while(args < max)
   {
      day = va_arg(args_copy, char *);
      printf("Day: %s\n", day);
      args++;
   }
   va_end(args_copy);
}
 
/******************  Output should be similar to:  ****************
Day: Sat
Day: Sun
Day: Sat
Day: Sun

Day: Mon
Day: Tues
Day: Wed
Day: Mon
Day: Tues
Day: Wed
*/

相关信息