Domanda

Voglio passare un va_list attraverso a un'altra funzione. Ecco un esempio di quello che sto cercando di fare:

void my_printf_1(char* string, ...){
    va_list   ap;
    va_start (ap, string);
    printf(string, ap);
    va_end(ap);
}

void my_printf_2(char* string, ...){
    va_list   ap;
    va_start (ap, string);
    printf(string, *ap);
    va_end(ap);
}

void main(void){
    my_printf_1("Hello %i\n", 12); //Shows me the Pointer
    my_printf_1("Hello \n"); //Runtime Error - too Many Arguments
    my_printf_2("Hello %i\n", 12); //Displays correctly because 12 < char
    my_printf_2("Hello %i\n", 500); //Displays incorrectly  because 500 > char
    my_printf_2("Hello %i %i\n", 12, 12); //Displays 12, then crashes Runtime Error not enough arguments
    my_printf_2("Hello \n"); //Runtime Error - too Many Arguments
}

Mi sembra che la mia va_list ap è un puntatore char, come posso ottenere la lista completa? Come posso riscrivere my_printf() per passare il tutto o un falso va_list a sottofunzioni? Non riesco a modificare le mie funzioni parziali di accettare i puntatori va_list, quindi dovrò modificare my_printf.

EDIT: Mi rendo conto che il seguente avrebbe funzionato, tuttavia questo non è quello che voglio.

void my_printf_1(char* string, ...){
va_list   ap;
va_start (ap, string);
vprintf(string, ap);
va_end(ap);
}
È stato utile?

Soluzione

È necessario fare quello che dici, ma in modo esplicito. Che è, passare l'oggetto va_list reale.

Vedere la funzione vsnprintf() per l'ispirazione. Le funzioni che accettano un va_list esplicito sono spesso preceduti da un v nella libreria standard.

Il va_list non ha una struttura interna che si può lavorare con, esso è opaco. Tutto si può fare è definito nell'intestazione <stdarg.h>.

Altri suggerimenti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top