Cette librairie permet de coder des fonctions à nombre variable de paramètres (d'arguments).
L'exemple le plus connu de fonction à nombre variable de paramètres est certainement la fonction
printf : vous pouvez passer à cette fonction autant de paramètres que ce que compte
le format de caractères %. Il est donc possible de l'invoquer avec un paramètre, avec deux, trois ou plus. Un autre exemple similaire
de fonction à nombre variable de paramètres est scanf.
La difficulté avec ce type de fonction, réside dans le fait que l'on ne nomme pas tous les paramètres étant donné qu'on n'en connait pas le nombre à
l'avance. Il faudra donc manipuler des pointeurs directement sur la pile d'exécution : autant dire que ce n'est pas si simple.
C'est là qu'intervient la librairie <stdarg.h> : elle vous fournit une ensemble de macros simplifiant fortement les
manipulations de ces pointeurs.
Notez aussi, qu'on ne connait pas forcément les types des paramètres à l'avance. C'est clairement le cas de la fonction
printf. C'est le format qui fournira ces informations au moment de l'invocation
de la fonction. Les macros de la librairie <stdarg.h> nous aideront aussi sur ce point.
Une fonction à nombre variable de paramètres se reconnait facilement : l'élément syntaxique ... doit être placé à
la fin de la liste de paramètres de votre fonction. A titre d'exemple, voici la signature de la fonction
printf.
int printf( const char *format, ... );
Attention : pour permettre de trouver les paramètres sur la pile d'exécution, il est nécessaire de connaitre au moins un
paramètre de la fonction. C'est grace à ce paramètre, qu'une variable de type va_list
pourra être initialisée. En conséquence, l'exemple ci-dessous est incohérent et ne compilera pas !
void aFunction( ... ); // Build failed !
Voici, pour information, le message d'erreur produit par GCC et affiché dans l'atelier de développement Eclipse.
Cette librairie ne définit qu'un unique type de données : va_list. Il stocke les informations
nécessaires au parcours des paramètres sur la pile d'exécution.
La librairie <stdarg.h> définit quatre macros (dont une depuis la version C99 du standard).
| Nom | Depuis | Description |
|---|---|---|
| va_arg | C89 | Permet l'extraction du prochain paramètre passé à la fonction. |
| va_copy | C99 | Permet la copie de la liste d'arguments. |
| va_end | C89 | Permet la libération des ressources acquises pour le parcourt de la liste d'arguments. |
| va_start | C89 | Initialise d'une structure va_list à partir d'un paramètre de la liste. |
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 :