Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

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

La librairie stdalign.h La macro __STDC_VERSION_STDARG_H__


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

Présentation de l'entête <stdarg.h>

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.

POSIX reprend cet entête en s'alignant sur le standard C ISO. Il n'ajoute pas de fonction, de type ou de macro propre à <stdarg.h>.

Entête à inclure

#include <stdarg.h>  // <cstdarg> en C++

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

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.

Eléments fournis par la librairie <stdarg.h>

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

Exemple d'utilisation

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;
}
Additionner une liste variable d'entiers

Cet exemple produit l'affichage suivant.

60

Sujets connexes

printf
vfprintf, vprintf, vsprintf et vsnprintf


La librairie stdalign.h La macro __STDC_VERSION_STDARG_H__




Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé