Accès rapide :
Présentation de l'entête <stdarg.h>
Entête à inclure
Définition d'une fonction à nombre variable de paramètres
Eléments fournis par la librairie <stdarg.h>
Exemple d'utilisation
Sujets connexes
Cette librairie permet de coder des fonctions à nombre variable de paramètres. L'exemple le plus connu est certainement
la fonction printf : le nombre et le type des arguments dépendent du format.
Un autre exemple similaire est scanf.
La difficulté vient du fait que tous les paramètres ne sont pas nommés et que leurs types ne sont pas forcément connus
directement par la fonction appelée. L'entête <stdarg.h> fournit donc un type, va_list, et un
petit ensemble de macros pour parcourir proprement cette liste d'arguments.
<stdarg.h>.
#include <stdarg.h> // <cstdarg> en C++
Une fonction à nombre variable de paramètres utilise l'élément syntaxique ... à la fin de sa liste de paramètres.
Voici, à titre d'exemple, une signature simplifiée de printf.
int printf( const char *format, ... );
Jusqu'à C17, il fallait obligatoirement au moins un paramètre nommé avant les trois points : ce dernier paramètre était
transmis à va_start. Depuis C23, une fonction peut aussi être définie directement avec
..., et va_start peut être appelée uniquement avec la variable va_list.
| Nom | Type | Description | Depuis |
|---|---|---|---|
__STDC_VERSION_STDARG_H__ |
macro | Version de l'entête <stdarg.h>. |
C23 |
va_list |
type | Type objet complet qui conserve l'état du parcours d'une liste d'arguments. | C89 |
va_arg |
macro | Extrait le prochain argument de la liste. | C89 |
va_copy |
macro | Copie l'état d'une liste d'arguments. | C99 |
va_end |
macro | Termine le parcours d'une liste d'arguments. | C89 |
va_start |
macro | Initialise une variable va_list avant le premier appel à va_arg. |
C89, forme simplifiée en C23 |
L'exemple suivant additionne un nombre variable d'entiers. Le premier argument indique combien de valeurs doivent être lues.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> int addition( int counter, ... ) { va_list arguments; va_start( arguments, counter ); int sum = 0; for ( int index = 0; index < counter; index++ ) { sum += va_arg( arguments, int ); } va_end( arguments ); return sum; } int main() { printf( "%d\n", addition( 3, 10, 20, 30 ) ); return EXIT_SUCCESS; } |
Cet exemple produit l'affichage suivant.
60
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :