2012-12-04 12 views
14

Se ho un va_list so come estrarre tutti i suoi elementi:Come faccio a compilare un va_list

void printInts(int n,...) 
{ 
    va_list va; 
    va_start(va, n); 
    for(unsigned int i=0; i<n; i++) 
    { 
     int arg=va_arg(va, int); 
     printf("%d",arg); 
    } 
    va_end(va); 
} 

Così, quando io chiamo printInts (3,1,2,3) la va_list avere riempito di tutto i parametri.
Ma come faccio a compilare manualmente una va_list senza usare va_start? Voglio dire che voglio qualcosa di simile:

va_list va; 
push_arg(va, int, 5); // And so on until I fill all parameters 
... 

ho bisogno di questo perché non v'è una funzione che accetta un va_list come argomento, e non so come riempire quel va_list di tutti i suoi parametri.

+0

Il tipo 'va_list' non è in realtà una lista come tale, in realtà è spesso una specie di puntatore allo stack e' va_arg' modifica questo puntatore per puntare all'argomento successivo sullo stack. –

+0

@JoachimPileborg: A volte non è un puntatore allo stack. –

+0

Perché non vuoi usare 'va_start'? – szx

risposta

12

Non è possibile compilare esplicitamente una va_list.

Si dovrebbe scrivere una funzione wrapper. Diciamo che è necessario chiamare la funzione foo, invece di riempire manualmente in un va_list, si definisce una nuova funzione in questo modo:

void call_foo(int arg1, ...) 
{ 
    va_list ap; 
    va_start(ap, arg1); 
    foo(arg1, ap); 
    va_end(ap); 
} 

Ora è possibile chiamare foo, che prende un va_list, come più vi piace, facendo per esempio call_foo (1,2,3,4) ;, call_foo (1, 1, "Ciao"); ecc.

Ciò consentirà solo di specificare gli argomenti in fase di compilazione, non è possibile creare gli argomenti in fase di esecuzione.

0

Non penso che ci sia un modo standard per farlo. D'altra parte, un tale pre-riempito va_list sarebbe abbastanza inutile, dal momento che non c'è modo di "interrogarlo" per il numero e il tipo di argomenti disponibili.

+2

Penso che la domanda sia come "come chiamo' vprintf() '?" e la risposta è "scrivi' printf() 'e chiamalo da lì". –

+0

Esiste una funzione di un framework che accetta una va_list, come faccio a aggirarlo? –

+0

@RamyAlZuhouri Come scritto in precedenza - due risposte. – glglgl

8

Normalmente, queste funzioni sono disponibili in coppia. Se si dispone di una funzione di "va-accettazione", è facile creare un altro:

void printInts_v(int n, va_list ap) 
{ 
    unsigned int i=0; 
    for(i=0; i<n; i++) 
    { 
     int arg=va_arg(ap, int); 
     printf("%d", arg); 
    } 
} 

Questa funzione può essere chiamata in questo modo:

void printInts(int n,...) 
{ 
    va_list ap; 
    va_start(ap, n); 
    printInts_v(n, ap); 
    va_end(va); 
} 

Ma io non credo che ci sia un modo per pre-compilare un va_list per uso futuro.

Se lavori su un'architettura e la portabilità non è un problema, puoi comunque creare qualcosa da solo. Come esattamente farlo è specifico della piattaforma.

+1

Che è valido C. È stato valido C per gli ultimi 13 anni. È stata un'estensione diffusa a C più a lungo. –

+0

Lo uso in C99. –

+0

Ok, thx & sorry :-) – glglgl

Problemi correlati