对于可变参数列表的函数

所需的功能变量列表声明可使用中的省略号 (...) 参数列表,如 变量参数列表所述。 使用类型,并在 STDARG.H 中描述的宏包含文件传递变量的访问参数列表。 有关这些宏的更多信息,用于 C 运行库请参见文档中的 va_arg, va_end, va_start

示例

下面的示例演示 va_startva_argva_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 宏停止变量参数处理。

请参见

参考

C++函数定义