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);
}
Était-ce utile?

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/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top