Freigeben über


Funktionen mit Variablenargumentlisten

Funktionen, die Variablenlisten erfordern, werden deklariert, indem die Auslassungszeichen (...) in der Argumentliste verwendet werden, wie in Variablenargumentlisten beschrieben. Verwenden Sie die Typen und Makros, die in der STDARG.H-Includedatei beschrieben werden, um auf Argumente zuzugreifen, die von einer Variablenliste übergeben werden. Weitere Informationen zu diesen Makros finden Sie unter va_arg, va_end, va_start in der Dokumentation zur C-Laufzeitbibliothek.

Beispiel

Das folgende Beispiel zeigt die Zusammenarbeit der Makros va_start, va_arg und va_end mit dem Typ va_list (deklariert 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

Das vorherige Beispiel verdeutlicht diese wichtigen Konzepte:

  • Sie müssen eine Listenmarkierung als Variable vom Typ va_list erstellen, bevor auf beliebige Variablenargumente zugegriffen wird. Im vorherigen Beispiel wird die Markierung als vl bezeichnet.

  • Auf die einzelnen Argumente wird unter Verwendung des Makros va_arg zugegriffen. Sie müssen dem va_arg-Makro den Typ des abzurufenden Arguments mitteilen, sodass es 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 für va_arg angegeben wurde, sind die Ergebnisse unvorhersehbar.

  • Sie sollten das erhaltene Ergebnis explizit in den gewünschten Typ umwandeln, indem Sie das va_arg-Makro verwenden.

  • Sie müssen das va_end-Makro aufrufen, um die Variablenargumentverarbeitung zu beenden.

Siehe auch

Referenz

C++-Funktionsdefinitionen