Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用另一个变量函数的未指定参数调用变量函数_C++_C_Variadic Functions - Fatal编程技术网

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);
}