Как я могу передать va_list через функцию в C90 - PullRequest
1 голос
/ 28 апреля 2011

Я хочу передать va_list в другую функцию.Вот пример того, что я пытаюсь сделать:

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
}

Мне кажется, что мой va_list ap является указателем char, как я могу получить весь список?Как я могу переписать my_printf(), чтобы передать целое или фальшивое va_list подфункциям?Я не могу изменить свои подфункции так, чтобы они принимали va_list указатели, поэтому мне придется изменить my_printf.

РЕДАКТИРОВАТЬ: я понимаю, что следующее будет работать, но это не то, что я хочу.

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

Ответы [ 2 ]

6 голосов
/ 28 апреля 2011

Вы должны делать то, что говорите, но явно. То есть передать фактический va_list объект.

См. Функцию <a href="http://linux.die.net/man/3/sprintf" rel="nofollow">vsnprintf()</a> для вдохновения. Функции, которые принимают явный va_list, часто имеют префикс v в стандартной библиотеке.

va_list не имеет внутренней структуры, с которой вы можете работать, он непрозрачен. Все, что вы можете сделать, определено в заголовке <a href="http://linux.die.net/man/3/stdarg" rel="nofollow"><stdarg.h></a>.

1 голос
/ 28 апреля 2011

Проверьте vprintf и друзей.http://www.manpagez.com/man/3/vprintf/

...