2011-01-26 14 views
10

Come faccio a scorrere un va_list se il numero di argomenti aggiuntivi è sconosciuto? Come eseguire il ciclo di una va_list se il numero di argomenti è sconosciuto?

#include <stdio.h> 
#include <stdarg.h> 

int add(int x, int y, ...) { 
    va_list intargs; 
    int temp = 0; 

    va_start(intargs, y); 
    int i; 
    for (i = 0; i < 3; i++) { /* How can I loop through any number of args? */ 
     temp += va_arg(intargs, int); 
    } 
    va_end(intargs); 

    return temp + x + y; 
} 

int main() { 
    printf("The total is %d.\n", add(1, 2, 3, 4, 5)); 
    return 0; 
} 
+0

Probabilmente avrai bisogno di un NULL alla fine e cercalo. –

+0

Grazie, questo è in realtà l'approccio che sto prendendo ora. Penso che sia più facile dell'utilizzo di un contatore arg all'inizio della chiamata. Alla fine è più facile piazzare un NULL. – Bob

risposta

14

utilizzare un valore sentinella come terminatore, per esempio NULL o -1

+1

Cosa fare se si desidera aggiungere 0 o un numero negativo? 'va_arg (intargs, int)' assegnerà NULL a 0. –

+0

Esempio: http://www.cplusplus.com/reference/cstdarg/va_end/ – dlchambers

2

probabilmente si vuole fare qualcosa di simile a passare il numero di argomenti come primo parametro.

E.g. vedi qui: http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

E più la discussione qui: http://www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/

argomenti variabili possono essere pericolosi in modo, se possibile mi piacerebbe provare a evitarle. Passare un tipo di "vettore" che include la dimensione e un puntatore all'array di elementi sarebbe più sicuro.

+0

Grazie, sto usando ANSI C, e non penso che ci sia un altro modo per evitarlo. – Bob

+0

@Bob: passa un int * e la dimensione dell'array. Il problema con il NULL alla fine è che a un certo punto qualcuno lo dimenticherà e potrebbe diventare un bug difficile da debugare. –

17

È necessario indicare il numero di parametri in qualche modo (se si sta scrivendo codice portabile) quando si utilizza liste di argomenti di lunghezza variabile. Ora stai pensando "Ma printf non ti richiede di indicare un numero di argomenti!"

Vero, tuttavia il numero può essere dedotto analizzando prima le stringhe di formato per gli indicatori di formato%.

Problemi correlati