La structure va_list

Utilisation

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

Exemple de code

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.

Sujets connexes