在运行时使用任意堆栈数据手动调用C函数

时间:2012-04-09 20:26:21

标签: c stack

我知道为什么这是一个坏主意的原因,我也知道这就是C ++模板创建的原因,但我在C中这样做是为了娱乐和学习。

我正在将Python嵌入到我的应用程序中,我希望能够在应用程序运行时注册某些具有任意类型的C函数。因此存储了指向它们的指针(作为一个简单的void *)。

通过一些基本的宏乐趣,我得到了关于这些函数所需的所有信息并存储了它 - 函数指针,返回值的大小(如果它是无效的),参数的数量和它们的每一个尺寸。

所以我陷入了最后阶段 - 这是用适当的数据实际调用函数指针。我很确定这种事情应该是可能的(我在自己的时间里造成了堆栈错误),但我想知道是否有更合理的方法来做这件事。

我想理想会是这样的:

void call_function(void* function, void* return, void* arg_data, int arg_data_size);

这样的事情存在吗?

由于

1 个答案:

答案 0 :(得分:1)

你可以声明一个函数指针void* (*f) (void*);,它指向一个带有void*参数并返回void*返回值的函数 - 你可以把它放在{的第一个参数中{1}}。

然后将call_function称为:

call_function

其中void* function(void*); ret_type ret; arg_type arg_data; call_function(&function, (void*)&ret, (void*)&arg_data, sizeof(arg_data)); 是您要在arg_type中使用的实际参数类型,而functionret_type的返回值的实际类型。

注意:您可能还想指定返回值类型的大小。

注意:这将适用于一个参数的任何函数。解决方案可以扩展到function中固定/已知数量的参数,但不能处理未知数量的参数。

注意:不允许命名第二个参数function,因为return是关键字。