动态调用具有可变参数的函数

Calling function with variable arguments dynamically

是否可以从 C 代码动态调用带有可变参数的函数?

例如我有包含数据的文本文件(使用此方案编写:function_name 个参数)例如:

func1 1 2 3
func2 1
func3

我用 C 编写的程序正在解析此文件,并通过比较字符串和调用此函数的指针来查找具有给定名称的填充数组(其中包含字符串中的函数名称和目标本机函数指针)来自文本文件的参数。例如这样的函数:

void func1(int a, int b, int c) { }
void func2(int a, int b) { }
void func3() { }

问题是,即使我知道参数个数,我也不知道如何在 C 函数指针调用中编写动态参数个数。是否有可能填充 va_list (我知道这不是容器或典型的数组!)然后传递给本机函数或任何其他方式来执行此操作?我想到的唯一方法是使用 x86 代码填充 dynarec 块,以使用可变参数调用本机函数,但这不是一个干净的解决方案。这样的事情在普通 C 中甚至可能吗?

如果难以理解,请写下来,我会尽力解释得更好。如果你想写 "use va_list" - 然后再仔细阅读我的 post。

提前致谢。

我喜欢你的思维方式,因为很明显,你是一个真正的黑客,但是...

不要尝试这样做.

这样做的正确方法是改变这些函数,使它们中的每一个都接受一组 int 而不是单个 int 参数。但我想如果你有自由去改变它们,你早就做了而且你不会问。

下一个最好的方法是编写一些函数,conv1()conv2()conv3() 等,每个函数接受一个 int 数组,和一个指向接受单个 int 参数的函数的指针。因此,convN() 接受一个 N 整数数组,以及一个指向接受 N 个单独 int 参数的函数的指针。它从数组中读取每个 int 并将其作为参数传递给函数。它可以做到这一点,因为它是专门为处理具有精确数量参数的函数而编写的。然后,在你的带有函数名和函数指针的 table 中,添加一个指向右边 convN() 函数的指针,这取决于目标函数期望的参数数量。

不要破解它。

我是自己回答,因为这将是其他人的解决方案。如果你想在不直接编写机器代码的情况下动态调用带有可变参数的函数,只需使用 FFCALL 中的 avcall 库。可以找到 avcall 库的快速参考指南 here。这是一个使这成为可能的跨平台库。例如,要调用名为 func1 且 return 类型为 void 的函数,它接受三个参数并且所有参数均为 int 类型,只需执行以下操作:

#include <avcall.h>

int a = 1, b = 2, c = 3;

av_alist alist;
av_start_void(alist,&func1);
av_int(alist,a);
av_int(alist,b);
av_int(alist,c);
av_call(alist);

您当然可以将其用于 return 值或接受不同类型参数的函数,更多信息请查看 avcallmanual page . :)