【发布时间】:2011-04-28 12:16:43
【问题描述】:
我想将 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);
}
【问题讨论】:
-
您的编译器+头文件可能碰巧将
va_list定义为char*,但这取决于实现。您只能对带有va_start、va_arg、va_copy和va_end的va_list进行操作,如 e.g. C99 标准 7.15。
标签: c variadic-functions c89 cvi