La librairie <stdarg.h> (<cstdarg> en C++)

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.

Définition d'une fonction à nombre variable de paramètres

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.

Erreur de syntaxe

Type de données fourni par la librairie <stdarg.h>

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.

Macros fournies par la librairie <stdarg.h>

La librairie <stdarg.h> définit quatre macros (dont une depuis la version C99 du standard).

va_arg : extraction du prochain paramètre.
va_copy : copie de la liste d'arguments (C99).
va_end : libération des ressources acquises pour le parcourt de la liste d'arguments.
va_start : initialisation d'une structure va_list à partir d'un paramètre de la liste.