2

最近我想实现一个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版本怎么办?)


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

假设你有一个printfC 库中的普通函数。

有人给你一个fmtstring"%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

希望这可以澄清。

4

2 回答 2

3

如果您只想使用它在输出之前添加一个字符串,您可以使用可变参数宏。

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

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

于 2012-10-18T13:35:23.100 回答
2

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

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

于 2012-10-18T12:44:24.703 回答