我知道为什么这是一个坏主意的原因,我也知道这就是C ++模板创建的原因,但我在C中这样做是为了娱乐和学习。
我正在将Python嵌入到我的应用程序中,我希望能够在应用程序运行时注册某些具有任意类型的C函数。因此存储了指向它们的指针(作为一个简单的void *)。
通过一些基本的宏乐趣,我得到了关于这些函数所需的所有信息并存储了它 - 函数指针,返回值的大小(如果它是无效的),参数的数量和它们的每一个尺寸。
所以我陷入了最后阶段 - 这是用适当的数据实际调用函数指针。我很确定这种事情应该是可能的(我在自己的时间里造成了堆栈错误),但我想知道是否有更合理的方法来做这件事。
我想理想会是这样的:
void call_function(void* function, void* return, void* arg_data, int arg_data_size);
这样的事情存在吗?
由于
答案 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
中使用的实际参数类型,而function
是ret_type
的返回值的实际类型。
注意:您可能还想指定返回值类型的大小。
注意:这将适用于一个参数的任何函数。解决方案可以扩展到function
中固定/已知数量的参数,但不能处理未知数量的参数。
注意:不允许命名第二个参数function
,因为return
是关键字。