是否可以将函数的参数列表传送到另一个函数?
例如在我的functionA中,我想用varargs列表中的参数调用我的functionB / functionC(取决于执行状态)。请注意,我无法更改functionB / functionC声明。
int functionA(int a, ...){
...
va_list listPointer;
va_start( listPointer, a);
...
}
int functionB(long b, long c, long d){
...
...
}
int functionC(long b, int c, int d){
...
...
}
对于这个项目,我使用gcc 4.9.1。
我到目前为止尝试的是从listPointer传递void *但是它没有用...
从va_list中提取变量也行不通,因为我有80个其他similair函数应该从functionA调用,这意味着我无法提取参数并通过提取的值调用。
也许有办法复制functionA参数的内存并用指针调用functionB / functionC?有没有人知道如何做到这一点?
答案 0 :(得分:2)
如果您无法更改功能B,则必须从functionA
va列表中提取参数:
#include <stdarg.h>
#include <stdio.h>
int functionB(long b, long c, long d)
{
return printf("b: %d, c: %d, d: %d\n", b, c, d);
}
int functionA(int a, ...)
{
...
va_list va;
va_start(va, a);
long b = va_arg(va, long);
long c = va_arg(va, long);
long d = va_arg(va, long);
va_end(va);
return functionB(b, c, d);
}
也许有办法复制functionA参数的内存并用指针调用functionB / functionC?有没有人知道如何做到这一点?
然后,这意味着您必须更改functionB
,functionC
等的声明。您可以将其更改为接受va_list
:
int functionA(int a, va_list args);
int functionC(int c, va_list args);
答案 1 :(得分:1)
如果longs
中只有va_args
可以使用。
int functionA(int a, ...){
va_list listPointer;
va_start( listPointer, a);
long b = va_arg(listPointer, long);
long c = va_arg(listPointer, long);
long d = va_arg(listPointer, long);
va_end(listPointer);
return functionB(b, c, d);
}
答案 2 :(得分:1)
您无法更改B的签名,但是您可以更改A的签名吗? 如果是这样,这可能是一个不错的选择:
template <typename... Args>
int functionA(Args&& ... args)
{
return functionB(std::forward<Args>(args)...);
}