Programmer en langage C
116
© Éditions Eyrolles
N’oubliez pas que ces variables automatiques se trouvent alors initialisées à chaque appel de
la fonction dans laquelle elles sont définies.
12 Les arguments variables en nombre
Dans tous nos précédents exemples, le nombre d’arguments fournis au cours de l’appel d’une
fonction était prévu lors de l’écriture de cette fonction.
Or, dans certaines circonstances, on peut souhaiter réaliser une fonction capable de recevoir un
nombre d’arguments susceptible de varier d’un appel à un autre. C’est d’ailleurs ce que nous
faisons (sans même y penser) lorsque nous utilisons des fonctions comme printf ou scanf
(en dehors du premier argument, qui représente le format, les autres sont en nombre quelconque)
Le langage C permet de résoudre ce problème à l’aide des fonctions particulières va_start
et va_arg. La seule contrainte à respecter est que la fonction doit posséder certains arguments fixes (c’est-à-dire toujours présents), leur nombre ne pouvant être inférieur à un. En
effet, comme nous allons le voir, c’est le dernier argument fixe qui permet, en quelque sorte,
d’initialiser le parcours de la liste d’arguments.
12.1 Premier exemple
Voici un premier exemple de fonction à arguments variables : les deux premiers arguments
sont fixes, l’un étant de type int, l’autre de type char. Les arguments suivants, de type int,
sont en nombre quelconque et l’on a supposé que le dernier d’entre eux était -1. Cette
dernière valeur sert donc, en quelque sorte, de sentinelle. Par souci de simplification, nous
nous sommes contentés, dans cette fonction, de lister les valeurs de ces différents arguments
(fixes ou variables), à l’exception du dernier.
Arguments en nombre variable délimités par une sentinelle
#include
#include
void essai (int par1, char par2, ...)
{
va_list adpar ;
int parv ;
printf ("premier paramètre : %d\n", par1) ;
printf ("second paramètre : %c\n", par2) ;
va_start (adpar, par2) ;
while ( (parv = va_arg (adpar, int) ) != -1)
printf ("argument variable : %d\n", parv) ;
}
Delannoy Livre.book Page 116 Mercredi, 6. mai 2009 4:26 16
116
© Éditions Eyrolles
N’oubliez pas que ces variables automatiques se trouvent alors initialisées à chaque appel de
la fonction dans laquelle elles sont définies.
12 Les arguments variables en nombre
Dans tous nos précédents exemples, le nombre d’arguments fournis au cours de l’appel d’une
fonction était prévu lors de l’écriture de cette fonction.
Or, dans certaines circonstances, on peut souhaiter réaliser une fonction capable de recevoir un
nombre d’arguments susceptible de varier d’un appel à un autre. C’est d’ailleurs ce que nous
faisons (sans même y penser) lorsque nous utilisons des fonctions comme printf ou scanf
(en dehors du premier argument, qui représente le format, les autres sont en nombre quelconque)
Le langage C permet de résoudre ce problème à l’aide des fonctions particulières va_start
et va_arg. La seule contrainte à respecter est que la fonction doit posséder certains arguments fixes (c’est-à-dire toujours présents), leur nombre ne pouvant être inférieur à un. En
effet, comme nous allons le voir, c’est le dernier argument fixe qui permet, en quelque sorte,
d’initialiser le parcours de la liste d’arguments.
12.1 Premier exemple
Voici un premier exemple de fonction à arguments variables : les deux premiers arguments
sont fixes, l’un étant de type int, l’autre de type char. Les arguments suivants, de type int,
sont en nombre quelconque et l’on a supposé que le dernier d’entre eux était -1. Cette
dernière valeur sert donc, en quelque sorte, de sentinelle. Par souci de simplification, nous
nous sommes contentés, dans cette fonction, de lister les valeurs de ces différents arguments
(fixes ou variables), à l’exception du dernier.
Arguments en nombre variable délimités par une sentinelle
#include
#include
void essai (int par1, char par2, ...)
{
va_list adpar ;
int parv ;
printf ("premier paramètre : %d\n", par1) ;
printf ("second paramètre : %c\n", par2) ;
va_start (adpar, par2) ;
while ( (parv = va_arg (adpar, int) ) != -1)
printf ("argument variable : %d\n", parv) ;
}
Delannoy Livre.book Page 116 Mercredi, 6. mai 2009 4:26 16
