包含C中可变参数的函数的包装器

时间:2012-10-18 12:36:33

标签: c variadic-functions

最近我想实现一个printf包装器。经过一些搜索后,我发现vprintf对这个需求很有用:

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

但是有可能为printf或任何其他类似函数实现这样的包装器而不是va_list吗?

(我的意思是,如果他们不提供v版本会怎么样?)


由于一些评论者没有完全理解我的想法,我最好详细说明一下。

假设你有一个普通的printf函数,就像在C库中一样。

有人给你一个fmt字符串"%d %u %f"和相应的输入。

现在您要编写类似于printf的函数,但所有%f都替换为%.2f

当然,您可以使用两个语句来完成任务:

replace(fmt, "%f", "%.2f");
printf(fmt, inputs);

但是如果你多次使用这个功能,可能你想要一个包装器来节省一些时间。

宏当然可以完成此任务。但如果没有宏,它是否可能,例如:

void myprintf(fmt, ...)
{
    replace(fmt, "%f", "%.2f");
    printf(fmt, inputs);
}

此处的问题是,您不知道如何使用printf的参数...来提供内部myprintf

希望这澄清。

2 个答案:

答案 0 :(得分:3)

如果您只想使用它来将字符串添加到输出左右,则可以使用可变参数宏。

#define MYPRINT(...) printf("toto has: " __VA_ARGS__)

在这个简单的例子中,这支持你传入的格式是一个字符串文字,所以这有点受限制。但我希望你看到如何使用这种简单的宏包装器的模式。

答案 1 :(得分:2)

当API没有为您提供va_list参数的函数时,没有可移植的方法来构造对可变参数函数的调用。

但是,您可以[ab]使用libffi来构建可变参数调用并执行此操作。