Dans le corps de la fonction on ne dispose pas de nom pour désigner les paramètres. L'accès à ceux-ci ne peut se faire qu'en utilisant les macros suivantes définies dans la bibliothèque standard :
Rien n'est prévu pour communiquer à la fonction le nombre et le type des paramètres effectivement passés : c'est un problème à la charge du programmeur.
#include <stdio.h>
#include <stdarg.h>
/*****************************************************************************/
/* */
/* addn */
/* */
/* But: */
/* réalise l'addition d'un nombre variable de paramètres */
/* */
/*****************************************************************************/
int addn(int nbopd, ...) /* nbopd = nombre d'opérandes du add */
{
int i, s = 0;
va_list(ap); /* déclaration de ap */
va_start(ap,nbopd); /* initialisation de ap */
for( i = 1; i <= nbopd; i++)
s = s + va_arg(ap,int); /* va_arg() donne le paramètre courant */
va_end(ap); /* on a fini */
return(s);
}
/*****************************************************************************/
/* main */
/*****************************************************************************/
int main()
{
printf("resu = %d\n",addn(3,10,11,12)); /* imprime 33 */
}
Dans cet exemple, le problème du nombre de paramètres effectifs a été réglé
par un paramètre obligatoire de la fonction : nbopd.
En ce qui concerne le type des paramètres effectifs, ils sont tous supposés
être entiers, d'où le va_arg(ap,int).
extern int printf(const char *, ...); extern int scanf(const char *, ...);Ces fonctions doivent connaître le nombre et le type des paramètres optionnels. Ce problème est réglé par les séquences d'échappement se trouvant dans le paramètre obligatoire :