如何通过C90中的函数传递va_list

时间:2011-04-28 12:16:44

标签: c ansi c89 cvi variadic-functions

我想将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 apchar指针,我怎样才能获得整个列表?如何重写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 个答案:

答案 0 :(得分:6)

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

请参阅vsnprintf()功能获取灵感。采用明确va_list的函数通常在标准库中以v为前缀。

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

答案 1 :(得分:1)

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