Le comportement général avec les fonctions est de les utiliser avec un nombre défini de paramètres. Ceux-ci correspondent à la signature
de la fonction. Par exemple int func(int x, char c);
. Mais qu'en est-il si nous souhaitons transmettre
un nombre variable d'arguments ? Cela pourrait nous servir par exemple pour une fonction d'addition avec un nombre d'éléments
variable, solution plus élégante que de créer un tableau et de le transmettre à la fonction. L'appel pourrait s'effectuer par
int resultat = somme(5, 1, 2, 3, 4, 5);
ou bien par int result = somme(2, 1, 2);
.
Le prototype d'une fonction avec arguments variables est le suivant : [type de retour] func(int counter, ...) {}
où counter est un entier référençant le nombre de valeurs qu'il y aura à traiter et l'ellipse notée ... contiendra les valeurs.
Pour réaliser cela nous allons utiliser les macros va_list de l'include stdarg.h
va_arg(aVaList, parameterType) Permet l'extraction du prochain paramètre passé à la macro. va_copy(vaListSrc, vaListDest) Permet la copie de la liste d'arguments. La liste initialisée par copie devra être libérée par un appel à va_end(). va_end(aVaList) Permet la libération des ressources acquises pour le parcourt de la liste d'arguments. va_start(aVaList, aParameter) Initialise d'une structure va_list à partir d'un paramètre de la liste.
Si le paramètre aParameter est une chaine de caractères, celle-ci sera parcourue caractère par caractères, symbolisant alors le
nombre de paramètres. Par exemple la chaine "Hello %s" passée en paramètre représentera un nombre de 8 caractères. A l'utilisateur
de cette macro de vérifier caractère par caractère cette chaine afin de déceler une valeur de format comme '%s' ici.