gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:34 25 4
gpt4 key购买 nike

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

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

有了一些基本的宏乐趣,我已经获得了关于这些函数的所有我需要的信息并存储了这些信息——函数指针、返回值的大小(如果它是空的)、参数的数量和它们的每个尺寸。

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

我想理想的样子应该是这样的:

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

有这种东西吗?

谢谢

最佳答案

您可以声明一个函数指针 void* (*f) (void*); 指向一个函数,该函数接受一个 void* 参数并返回一个 void* 返回值 -- 你可以把它放在 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 是您要在 function 中使用的实际参数类型,ret_type 返回值的实际类型>函数

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

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

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

关于c - 在运行时使用任意堆栈数据手动调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10079387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com