C++ 使用另一个变量函数的未指定参数调用变量函数
我有两个变量函数,分别是C++ 使用另一个变量函数的未指定参数调用变量函数,c++,c,variadic-functions,C++,C,Variadic Functions,我有两个变量函数,分别是foo(格式,…)和bar(格式,…)。我想实现函数foo,这样它就可以用它拥有的参数列表调用bar。就是 foo(format...) { ... bar(format, ...); } 例如,调用foo(“(ii)”,1,2)将使用相同的参数bar(“(ii)”,1,2)调用bar。这个foo功能应该如何实现 PS:functionbar来自一个旧库,我无法更改它的界面。简短回答-您不能。使酒吧成为一个va_列表。如果你愿意把它锁定到一个特定的编译器,你可能会用
foo(格式,…)
和bar(格式,…)
。我想实现函数foo
,这样它就可以用它拥有的参数列表调用bar
。就是
foo(format...)
{
...
bar(format, ...);
}
例如,调用foo(“(ii)”,1,2)
将使用相同的参数bar(“(ii)”,1,2)
调用bar
。这个foo
功能应该如何实现
PS:function
bar
来自一个旧库,我无法更改它的界面。简短回答-您不能。使酒吧成为一个va_列表
。如果你愿意把它锁定到一个特定的编译器,你可能会用内联汇编来完成它,但是用标准的C或C++来做它是不可能的。p>
作为一般规则,您应该始终按照
va_list
实现vararg函数,然后创建一个包装器省略号函数,调用真正的va_list
函数。无法完成,只要您拥有的是一堆带有参数的if函数
你必须提前计划类似的事情,并以两个阶段的方式实现每个变量函数
void vfoo(format, va_list *args) {
/* Process `*args` */
}
void foo(format, ...) {
va_list args;
va_start(args, format);
vfoo(format, &args);
va_end(args);
}
一旦通过一对va_list*
函数和..
函数实现了每个可变函数,就可以使用函数的va_list*
版本委派调用
void vfoo(format, va_list *args) {
...
vbar(format, args);
...
}
这在C++中工作:
#include <iostream>
template<typename Format>
void meheer(const Format& format) {
std::cout << format << std::endl;;
}
template<typename Format, typename Elt, typename ... Args>
void meheer(const Format& format, const Elt & e, const Args&... args) {
std::cout << format << e;
meheer(format, args...);
}
template<typename Format, typename ... Args>
void ohai(const Format& format, const Args&... args) {
meheer(format, args...);
}
int main(int argc, char ** argv) {
ohai(1,2,3);
return EXIT_SUCCESS;
}
当然,这是特定于C++0x的,但它在我不是最新版本的gcc中工作。另见:
更新添加了完整的示例。GCC可以
?
是参数占用的堆栈空间量,计算起来不一定很简单:您需要了解参数是什么,以及它们如何传递的特定于体系结构的详细信息
其他GCC扩展允许对宏和内联函数进行进一步的欺骗。我有点不同意“简短答案”。它可以在C++0x中使用可变模板完成(请参见其他地方的答案)。“C++的C++ C++语言(Max Lybbert):我只不过是问问题标签——C++的一个特别的):“C++中的哪一个是C++0x?”@ Pooji:C++0x不是C++(但)-不会用C++ 0x:回答“C++标记的Q”):埃里克:我知道…但是你真的希望委员会也花时间在这个名字上吗-p@Max利伯特:啊。我对你的评论读得太多了。抱歉。我不知道您想完成什么,但我几乎愿意打赌您会发现以下标准库函数非常方便:vprintf()
,vfprintf()
和vsprintf()
。
12131
foo() {
void *args = __builtin_apply_args();
void *ret = __builtin_apply(bar, args, ???);
__builtin_return(ret);
}