最近我想实现一个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
。
希望这澄清。
答案 0 :(得分:3)
如果您只想使用它来将字符串添加到输出左右,则可以使用可变参数宏。
#define MYPRINT(...) printf("toto has: " __VA_ARGS__)
在这个简单的例子中,这支持你传入的格式是一个字符串文字,所以这有点受限制。但我希望你看到如何使用这种简单的宏包装器的模式。
答案 1 :(得分:2)
当API没有为您提供va_list
参数的函数时,没有可移植的方法来构造对可变参数函数的调用。
但是,您可以[ab]使用libffi来构建可变参数调用并执行此操作。