6

我正在尝试将 printf 包装在 C 程序中(嗯,实际上是 _snprintf,但这个例子更简单)并且无法让变量参数的东西工作。这是我的代码:

#include <stdio.h>
#include <stdarg.h>

void works(void)
{
    printf("%d\n", 100);
}

void wrap_printf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    printf(fmt, args);
    va_end(args);
}

void broken(void)
{
    wrap_printf("%d\n", 100);
}

int main(void)
{
    works();
    broken();
    return 0;
}

这是我的输出:

100
3668388

args 变量在我的代码中调用后看起来不错va_start,但是一旦我进入 C 运行时代码并且他们调用va_start的值看起来很糟糕。关于我可能做错了什么的任何想法?

4

2 回答 2

10
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);

您需要调用vprintf而不是printf. v*printf函数理解va_List参数。我很惊讶你没有收到警告。

于 2012-05-28T15:11:48.650 回答
5

你正在传递argswhich is a va_list,但printf()当然直接期望参数,它无法知道它的第二个参数突然是 a va_list

您应该使用vprintf()确实期望 ava_list并且知道如何从中提取值的可变参数版本。

于 2012-05-28T15:12:32.063 回答