1

我想将 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);
}

int 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);
}
4

2 回答 2

6

你需要按照你说的去做,但要明确。也就是说,传递实际的va_list对象。

请参阅vsnprintf()函数以获取灵感。在标准库中,采用显式的函数va_list通常以 a 为前缀。v

va_list没有可以使用的内部结构,它是不透明的。您所能做的就是在<stdarg.h>标题中定义。

于 2011-04-28T12:17:53.780 回答
1

查看 vprintf 和朋友。http://www.manpagez.com/man/3/vprintf/

于 2011-04-28T12:19:09.697 回答