假设有一些参数以某种方式存储,例如在数组中。
给定一个函数指针,我如何调用它并传递存储的参数列表?
我不是试图将数组作为参数传递。你理解了没,好吧?我想逐个将其元素作为参数传递。数组只是为了说明,我可以将参数存储在某些元组结构中。此外,请注意,我手头有一个函数指针,并且可能具有字符串格式的签名。我不只是尝试定义一个能够处理可变参数列表的函数。
我唯一知道的方法是使用汇编(例如通过 __asm push
等)或者这样:
void (*f)(...);
int main()
{
f = <some function pointer>;
int args[]; <stored in a array, just to illustrate>
int num_args = <some value>;
switch(num_args)
{
case 0:
f();
break;
case 1:
f(args[0]);
break;
case 2:
f(args[0], args[1]);
break;
/* etc */
}
return 0;
}
我对这种方法不太满意...
有没有另一种更短小、更易携带的方式?
多种脚本语言可以调用C函数。
Python或Ruby等脚本语言是如何做到的?它们如何以可移植的方式实现?它们只是在几个平台上使用汇编,还是以上述方式结束?
请注意,我真的不是在问关于从脚本语言到C的参数整理和其他细节的问题,我只是对内部如何建立脚本语言对C函数的调用感兴趣。
编辑
我将保留问题的标题,但我认为一个更好的提问方式是:
如何仅在运行时使用其指针和签名来调用C函数?
更新
来自PLT Scheme Foreign Interface:
调用是一个普通的函数调用。在动态环境中, 我们创建一个“调用接口”对象,该对象指定(二进制) 输入/输出类型;此对象可与任意函数指针和输入值数组一起使用,以执行对函数的调用并检索其结果。这样做需要操纵堆栈并知道如何调用函数,这些都是 libffi 所处理的细节。
感谢@AnttiHaapala进行搜索、查找和指示libffi。这就是我要寻找的东西,它被一堆脚本语言使用,是一个便携式库,在几个架构和编译器中实现。
call_func(func_pointer, array_of_args);
这样的代码将会调用func_name(int arg1, float arg2, char *arg3)
函数。 - Vlad Balmos