Come posso passare un va_list attraverso una funzione in C90
-
26-10-2019 - |
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);
}
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
Scopri vprintf e amici. http://www.manpagez.com/man/3/vprintf/