对于可变参数列表的函数
所需的功能变量列表声明可使用中的省略号 (...) 参数列表,如 变量参数列表所述。 使用类型,并在 STDARG.H 中描述的宏包含文件传递变量的访问参数列表。 有关这些宏的更多信息,用于 C 运行库请参见文档中的 va_arg, va_end, va_start 。
示例
下面的示例演示 va_start、 va_arg和 va_end 宏与 va_list 类型一起使用 (在 STDARG.H 声明):
// variable_argument_lists.cpp
#include <stdio.h>
#include <stdarg.h>
// Declaration, but not definition, of ShowVar.
void ShowVar( char *szTypes, ... );
int main() {
ShowVar( "fcsi", 32.4f, 'a', "Test string", 4 );
}
// ShowVar takes a format string of the form
// "ifcs", where each character specifies the
// type of the argument in that position.
//
// i = int
// f = float
// c = char
// s = string (char *)
//
// Following the format specification is a variable
// list of arguments. Each argument corresponds to
// a format character in the format string to which
// the szTypes parameter points
void ShowVar( char *szTypes, ... ) {
va_list vl;
int i;
// szTypes is the last argument specified; you must access
// all others using the variable-argument macros.
va_start( vl, szTypes );
// Step through the list.
for( i = 0; szTypes[i] != '\0'; ++i ) {
union Printable_t {
int i;
float f;
char c;
char *s;
} Printable;
switch( szTypes[i] ) { // Type to expect.
case 'i':
Printable.i = va_arg( vl, int );
printf_s( "%i\n", Printable.i );
break;
case 'f':
Printable.f = va_arg( vl, double );
printf_s( "%f\n", Printable.f );
break;
case 'c':
Printable.c = va_arg( vl, char );
printf_s( "%c\n", Printable.c );
break;
case 's':
Printable.s = va_arg( vl, char * );
printf_s( "%s\n", Printable.s );
break;
default:
break;
}
}
va_end( vl );
}
注释
上一个示例演示以下基本概念:
,它的类型 va_list 的变量在任何可变参数之前的访问,您必须建立标记列表。 在前面的示例中,标记调用 vl。
使用 va_arg 宏,各个参数进行访问。 必须告诉 va_arg 宏参数的类型检索,以便可以从堆栈调用正确的字节数。 如果指定范围的不正确的类型具有名为的程序提供的不同于对 va_arg,结果是不可预知的。
应显式强制转换结果获取使用 va_arg 宏传递到所需的类型。
必须调用 va_end 宏停止变量参数处理。