假设有一个以某种方式存储的参数列表,例如,在数组中.
给定一个函数指针,我如何调用它来传递存储的参数列表?
我不是试图将数组作为参数传递好.你明白了,好吗?我想将每个元素作为参数传递.一个数组只是为了说明,我可以将参数存储在一些元组结构中.另外,看看我手头有一个函数指针,并且可能有字符串格式的签名.我不是只想定义一个能够处理可变列表的函数.
我看到如何做到这一点的唯一方法是使用汇编(由__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;
}
Run Code Online (Sandbox Code Playgroud)
我不太喜欢这种做法......
还有另一种便携式和更短的形式吗?
有几种脚本语言可以调用C函数.
像Python或Ruby这样的脚本语言是如何做到的?他们如何以便携方式实现它?他们最近只是为几个平台或上面的平台使用组件吗?
看看我真的不是在询问参数封送的细节以及从脚本语言到C的其他内容,我只对内部如何构建脚本语言对C函数的调用感兴趣.
我将保留问题的标题,但我认为更好的方式是:
如何调用C函数,其指针和签名仅在运行时可用?
来自外国接口的PLT计划:
呼出是正常的函数调用.在动态设置中,我们创建一个"调用接口"对象,它指定(二进制)输入/输出类型; 此对象可以与任意函数指针和输入值数组一起使用,以执行函数的调用并检索其结果.这样做需要操纵堆栈并知道如何调用函数,这些是libffi处理的细节.
感谢@AnttiHaapala搜索,查找和指向libffi.这就是我所寻找的,它被一堆脚本语言所使用,它是一个可移植的库,在多个架构和编译器中实现.