假设有一个以某种方式存储的参数列表,例如在一个数组中。
给定一个函数指针,我如何通过存储的参数列表调用它?
我不是想将数组作为参数传递好。你明白了,好吗?我想将它的每个元素作为参数传递。数组只是为了说明,我可以将参数存储在一些元组结构中。另外,看看我手头有一个函数指针,并且可能有一个字符串格式的签名。我不想仅仅定义一个能够处理可变参数列表的函数。
我看到如何做到这一点的唯一方法是使用汇编(由__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 函数?
更新
调出是正常的函数调用。在动态设置中,我们创建一个指定(二进制)输入/输出类型的“调用接口”对象;此对象可与任意函数指针和输入值数组一起使用,以执行对函数的调用并检索其结果。这样做需要操作堆栈并知道如何调用函数,这些都是libffi处理的细节。
感谢@AnttiHaapala 搜索、查找和指向libffi。这是我一直在寻找的,它被一堆脚本语言使用,它是一个可移植的库,跨多个架构和编译器实现。