Comment puis-je passer un va_list par une fonction C90
-
26-10-2019 - |
Question
Je veux passer un va_list par une autre fonction. Voici un exemple de ce que je suis en train de faire:
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
}
Il me semble que mon va_list ap
est un pointeur char
, comment puis-je obtenir toute la liste? Comment puis-je réécrire my_printf()
pour passer tout ou va_list
de faux à sous-fonctions? Je ne peux pas modifier mes sous-fonctions pour accepter des pointeurs de va_list
, donc je vais devoir modifier my_printf
.
EDIT: Je me rends compte que ce qui suit fonctionnerait, mais ce n'est pas ce que je veux.
void my_printf_1(char* string, ...){
va_list ap;
va_start (ap, string);
vprintf(string, ap);
va_end(ap);
}
La solution
Vous devez faire ce que vous dites, mais explicitement. C'est, passer l'objet va_list
réelle.
Voir la fonction vsnprintf()
d'inspiration. Les fonctions qui prennent un va_list
explicite sont souvent préfixées avec un v
dans la bibliothèque standard.
Le va_list
ne possède pas une structure interne que vous pouvez travailler avec, il est opaque. Tout ce que vous pouvez faire est défini dans l'en-tête de <stdarg.h>
.
Autres conseils
Découvrez vprintf et les amis. http://www.manpagez.com/man/3/vprintf/