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
*/