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

标签 c stack

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

相关文章:

C - 在堆栈上返回 2 个值

c++ - 使用 2 个队列实现堆栈

c - C 中的静态变量未初始化为零

c - Arduino IDE 在 const Struct 中使用 flash helper

c - 如何使用C将元素压入堆栈

C++ 数组列表

c - 如何将带有 BOM 的 UTF8 转换为 UTF16 LE

c - 尝试理解计数排序的复杂性

c - 如何在不知道长度的情况下初始化 C 中的字符串,并继续向其附加字符?

c++ - 使用节点实现重新填充堆栈