【发布时间】:2013-10-15 17:23:51
【问题描述】:
我正在尝试为 printf 等 C 风格的可变参数函数编写一个包装器,它添加了一些额外的参数,但我遇到了麻烦:
void printf(char* fmt, ...); // the thing I'm trying to wrap
void wrapper(char* fmt, ...)
{
printf(fmt, extra_arg1, extra_arg2, /* the variadic arguments */);
}
但是我要为/* the variadic arguments */ 写什么?
即使我要包装的函数有一个采用va_list 的版本,我也做不到:
void vprintf(char* fmt, va_list args);
void wrapper(char* fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, extra_arg1, extra_arg2, args);
va_end(args);
}
extra_arg1、extra_arg2 和 args 不会神奇地变成 vprintf 所期望的 va_list。
我知道我可以编写一个宏并使用__VA_ARGS__:
void printf(char* fmt, ...); // the thing I'm trying to wrap
#define wrapper(fmt, ...) printf(fmt, extra_arg1, extra_arg2, __VA_ARGS__)
但我试图避免这种情况并将包装器编写为函数。有没有办法做到这一点?
(顺便说一句,我也不能使用 C++11 可变参数模板。)
【问题讨论】:
-
你已经看过这里了吗:stackoverflow.com/a/150616/2036917
-
@UdoKlein:这些问题只是建议使用
va_list。我已经知道了,问题是我需要为其添加参数,但我不知道该怎么做。 -
我真的不明白您为什么需要使用单个
vprintf语句。据我所知,wrapper的额外参数也只是要打印正确的变量吗?为什么你不能使用单独的打印语句,或者最好只是以wrapper调用的格式包含它们? -
@Pankrates:我包装的实际函数不是
vprintf,它不具有两个连续调用与使用组合参数的单个调用具有相同效果的属性。跨度> -
一般情况下,您不能将 args 添加到 va_list。它是一个不透明的类型,它支持的唯一操作是 va_start 来初始化它, va_end 来表明你已经完成了它(也许是 va_copy)。现在,如果你找到了 va_start 的实现,也许你可以想出一个聪明的方法来添加 args,但这可能会破坏保证:)
标签: c++ c variadic-functions variadic-macros