Funktionen mit variablen Argumentlisten

Funktionen, die variable Listen erfordern, wird deklariert, indem die Auslassungspunkte (...) in der Argumentliste veranschaulicht, wie in Argumentlisten Variablebeschrieben.Verwenden Sie die Typen und Makros, die in der STDARG.H-Includedatei beschrieben werden, um Argumente zuzugreifen, die über eine variable Liste übergeben werden.Weitere Informationen zu diesen Makros finden Sie unter va_arg, va_end, va_start in der Dokumentation zur C-Laufzeitbibliothek.

Beispiel

Im folgenden Beispiel wird gezeigt, wie va_start, va_argund Makros va_end zusammen mit dem va_list-Typ deklariert arbeiten (in 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 );
}
  

Kommentare

Im vorherigen Beispiel verdeutlicht diese wichtigen Konzepten:

  • Sie müssen einen Listen marker herstellen, während eine Variable vom Typ va_list , bevor alle variablen Argumenten zugegriffen werden.Im vorherigen Beispiel wird der Marker vlaufgerufen.

  • Die einzelnen Argumente zugegriffen werden, indem das va_arg Makro verwendet.Sie müssen das va_arg Makro, das den Typ des abzurufenden Arguments anfordern, sodass die richtige Anzahl von Bytes aus dem Stapel übertragen kann.Wenn Sie einen falschen Typ Größe festlegen, die sich von der unterscheidet, die vom aufrufenden Programm zu va_argangegebene die Ergebnisse sind unvorhersehbar.

  • Sie sollten das Ergebnis explizit umwandeln va_arg abgerufene, indem Sie das Makro für den Typ, den Sie verwenden möchten.

  • Sie müssen das va_end Makro aufrufen, um Variablen Argument Verarbeitung zu beenden.

Siehe auch

Referenz

C++-Funktionsdefinitionen