我知道这是个坏主意的原因,我也知道这就是创建 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/