Compartir a través de


Funciones con listas de argumentos variables

Funciones que requiere listas variables se declara con los puntos suspensivos (...) en la lista de argumentos, como se describe en listas de argumentos variables.Utilice los tipos y las macros que se describen en el archivo de inclusión de STDARG.H para obtener acceso a los argumentos que se pasan por una lista de variables.Para obtener más información sobre estas macros, vea va_arg, va_end, va_start en la documentación de la biblioteca en tiempo de ejecución de C.

Ejemplo

El ejemplo siguiente se muestra cómo va_start, va_arg, y las macros de va_end funcionan junto con el tipo de va_list (declarado en 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 );
}
  

Comentarios

el ejemplo anterior muestra estos conceptos importantes:

  • Debe establecer un marcador de la lista como una variable de va_list tipo antes de cualquier argumento variable vez.En el ejemplo anterior, el marcador vl.

  • Los argumentos individuales se realiza mediante la macro de va_arg .Debe indicar a la macro de va_arg al tipo de argumento que recupere para poder transferir el número correcto de bytes de la pila.Si especifica un tipo incorrecto de un tamaño diferente del proporcionado por el programa de llamada a va_arg, los resultados son imprevisibles.

  • Debe convertir explícitamente el resultado obtenido mediante la macro de va_arg en el tipo que desee.

  • Debe llamar a la macro de va_end para finalizar el procesamiento de variable-argumento.

Vea también

Referencia

Definiciones de funciones de C++