Participer au site avec un Tip
Rechercher
 

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 :

La structure va_list

La macro va_end La macro va_start


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

va_arg
va_copy
va_end
va_start


La macro va_end La macro va_start