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 :