3

我想用另一个函数(也采用可变数量的参数)包装 xmlrpc“调用”函数(它接受可变数量的参数)。我想简单地将传入我的包装函数的可变数量的参数转发给 xmlrpc“调用”函数。我知道如何使用 va_start 和 va_arg,但我真的不关心传入的值,我只是想将它们转发给包装函数。这可能吗?

我想包装的功能的规格是

call(const char* url, const char* function, const char* paramSpec, void* result, ...);

我的包装器处理前三个参数和按引用的结果,它只需将其额外参数转发给调用函数

4

3 回答 3

5

不幸的是,没有办法提供通过...语法接受可变数量参数的函数的完美转发。这就是为什么最佳实践是根据函数实现所有公共变量参数列表函数,va_list并为任何客户端代码提供这两个接口。这就是标准库中有printfand vprintfsprintfandvsprintf等的原因。

如果没有vcall或类似的采取,va_list那么就没有简单的方法来做你想做的事。唯一的可能性是解释其他参数,以根据提供的固定参数计算出传递给函数的变量参数列表中必须包含的内容,将变量参数列表中的所有参数拉入单独的变量中,并制作一个数字call基于提取的参数的数量和类型的可能显式调用。完全笼统地做到这一点是不可能的。

于 2009-07-24T19:02:11.800 回答
2

是的,如果您可以控制包装函数,请从“...”更改为 va_list。以 vprintf 为例。

不确定您是否可以用另一个(...)包装(...)

于 2009-07-24T18:53:56.763 回答
0

这可能在某些平台上通过邪恶的黑客攻击成为可能。在 x86 上,参数从右到左压入堆栈,所以如果你要从堆栈中删除返回地址,压入额外的参数,然后替换它,你可以(理论上)做你想做的事。困难的部分是当你想对包装器内的返回值做一些事情时......

于 2009-07-24T19:24:33.643 回答