Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Funktionsdeklarationen mit auslassungszeichen (...) als letztes Argument verwenden eine variable Anzahl von Argumenten. C++ stellt die Typüberprüfung nur für die explizit deklarierten Argumente bereit. Sie können Variablenargumentlisten verwenden, wenn die Anzahl und die Typen von Argumenten für die Funktion variieren können. Die printf
Funktionsfamilie ist ein Beispiel für Funktionen mit Variablenargumentlisten.
Funktionen mit Variablenargumenten
Verwenden Sie die Makros, die in der Standarddatei enthalten sind, wie in diesem Artikel erläutert, um auf Argumente zuzugreifen, die in der Standarddatei <stdarg.h>
enthalten sind.
Microsoft-spezifisch
Mit Microsoft C++ können die Auslassungspunkte als Argument angegeben werden, wenn die Auslassungspunkte das letzte Argument sind und ein Komma vor den Auslassungszeichen steht. Daher ist die Erklärung int Func( int i, ... );
legal, aber int Func( int i ... );
nicht.
Ende Microsoft-spezifisch
Die Deklaration einer Funktion, die eine variable Anzahl von Argumenten verwendet, erfordert mindestens ein Platzhalterargument, auch wenn sie nicht verwendet wird. Wenn dieses Platzhalterargument nicht angegeben wird, gibt es keine Möglichkeit, auf die verbleibenden Argumente zuzugreifen.
Wenn Argumente vom Typ char
als variable Argumente übergeben werden, werden sie in Typ int
konvertiert. Wenn Die Argumente des Typs float
als variable Argumente übergeben werden, werden sie in Typ double
konvertiert. Argumente anderer Typen unterliegen den üblichen Ganzzahl- und Gleitkomma-Erweiterungen. Weitere Informationen finden Sie unter Standardkonvertierungen.
Funktionen, für die Variablenlisten erforderlich sind, werden mithilfe von Auslassungspunkten (...) in der Argumentliste deklariert. 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_copy, va_end, va_start.
Das folgende Beispiel zeigt, wie Sie mithilfe der Makros eine Variablenargumentliste verarbeiten:
// 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 );
}
32.400002
a
Test string
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 alsvl
bezeichnet. - Auf die einzelnen Argumente wird unter Verwendung des Makros
va_arg
zugegriffen. Sie müssen demva_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ürva_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 Verarbeitung variabler Argumente zu beenden.