Ce type de données, implémenté sous forme d'une structure, sera utilisé par les macros du module <stdarg.h>
.
Il est d'ailleurs défini dans le même module.
Il est à noter qu'il n'est pas de votre responsabilité d'initialiser une telle structure. Au contraire, il vous est demandé d'utiliser
la macro va_start
pour réaliser cette initialisation. Afin de libérer les ressources acquises
par va_start
, il vous est aussi demandé, en fin de fonction, d'utiliser la macro
va_end
L'exemple proposé ci-dessous défini une fonction permettant d'ajouter un nombre quelconque d'entiers. Le nombre d'entiers à sommer est précisé dans le premier paramètre (nommé) de la fonction.
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> int addition( int counter, ... ) { int sum = 0; va_list parametersInfos; /* Initialize the va_list structure */ va_start( parametersInfos, counter ); /* for all unnamed integer, do an addition */ while( counter > 0 ) { /* Extraction of the next integer */ sum += (int) va_arg( parametersInfos, int ); counter --; } /* Release va_list resources */ va_end( parametersInfos ); return sum; } int main( int argc, char * argv[] ) { int result = addition( 2 /* counter */, 3, 11 ); printf( "addition( 2, 3, 11 ) == %d\n", result ); /* 14 */ result = addition( 3 /* counter */, 4, 5, 6 ); printf( "addition( 3, 4, 5, 6 ) == %d\n", result ); /* 15 */ return EXIT_SUCCESS; }
Attention, si la valeur du compteur n'est pas cohérente par rapport au nombre de paramètres qui suivent ce compteur, le résultat calculé risquera d'être incohérent. D'autant plus si la valeur du compteur est supérieure : dans ce cas des octets supplémentaires seront lus et vous ne connaitrez pas à l'avance les valeurs stockées dans ces octets.
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 :