使用另一个可变参数函数的未命名参数调用可变参数函数

Ric*_*ard 9 c c++ variadic-functions

我有两个可变函数作为foo(format, ...)bar(format, ...).我想实现函数,foo以便它可以bar使用相同的参数列表调用它.那是,

foo(format...)
{
 ...
 bar(format, ...);
}
Run Code Online (Sandbox Code Playgroud)

例如,调用foo("(ii)", 1, 2)bar使用相同的参数调用bar("(ii)", 1, 2).该foo功能应该如何实施?

PS:函数bar来自遗留库,我无法更改其界面.

AnT*_*AnT 11

无法完成,只要你拥有的只是一堆带...参数的函数.

你必须提前计划这样的事情,并以两阶段的方式实现每个变量的功能

void vfoo(format, va_list *args) {
  /* Process `*args` */
}

void foo(format, ...) {
  va_list args;
  va_start(args, format);
  vfoo(format, &args);
  va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

通过一对va_list *函数和函数实现每个可变参数函数后...,可以使用va_list *函数版本委派调用

void vfoo(format, va_list *args) {
  ...
  vbar(format, args);
  ...
}
Run Code Online (Sandbox Code Playgroud)


eph*_*ent 8

GCC可以在运行时构造函数调用.

foo() {
   void *args = __builtin_apply_args();
   void *ret = __builtin_apply(bar, args, ???);
    __builtin_return(ret);
}
Run Code Online (Sandbox Code Playgroud)

??? 是参数占用的堆栈空间量,计算时不一定是微不足道的:您需要了解参数是什么以及有关如何传递它们的特定于体系结构的详细信息.

其他GCC扩展允许进一步使用宏和内联函数.