Fonctions avec des listes d'arguments variables
Fonctions qui requièrent des listes variables sont déclarés à l'aide de sélection (...) dans la liste d'arguments, comme décrit dans listes d'arguments variables.Utilisez les types et les macros décrits dans le fichier Include de STDARG.H pour accéder aux arguments passés par une liste variable.Pour plus d'informations sur ces macros, consultez va_arg ; va_end ; va_start dans la documentation de la bibliothèque runtime C.
Exemple
L'exemple suivant montre comment va_start, va_arg, et les macros d' va_end opèrent avec le type d' va_list (déclaré dans 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 );
}
Commentaires
L'exemple précédent illustre ces concepts importants :
Vous devez générer une marque de liste comme une variable de type va_list avant tous les arguments variables sont accessibles.dans l'exemple précédent, la marque est appelée vl.
Les différents arguments sont accessibles à l'aide de la macro de va_arg .Vous devez indiquer à la macro d' va_arg le type d'argument de récupérer de façon à pouvoir transférer le nombre correct d'octets de la pile.Si vous spécifiez un type incorrect d'une taille différente de celle fournie par le programme appelant à va_arg, les résultats sont imprévisibles.
Vous devez caster explicitement le résultat obtenu à l'aide de la macro de va_arg le type souhaité.
Vous devez appeler la macro d' va_end pour terminer le traitement de variable-argument.