C中的通用函数指针

时间:2012-08-15 14:24:34

标签: c

我正在编写一个通用测试函数,它接受一个函数地址(从映射文件中读取)和参数作为逗号分隔数据作为来自套接字的参数。

我能够为已知的函数指针实现它。

喜欢

void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);

通过上述方法,我将为代码库中的所有类型的函数实现编写函数指针。有没有通用的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

不,因为编译器需要知道如何表示参数。它不能知道对于排除信息的函数指针类型,因此它不能生成调用。

具有少量参数的函数可能会在CPU寄存器中传递它们,例如,在调用许多参数时“溢出”到堆栈。

你可以使用varargs解决这个问题,这样做基本上会“锁定”参数的传递方式。当然,它强制被调用的函数来处理varargs,这不是很方便。

答案 1 :(得分:0)

您可以执行以下操作。

fn_t fncptr;
fncptr= MapAddress + 0x(offset);

MapAdress是将文件映射到内存地址的位置。 (如果C ++编译器无法将偏移量添加到void,则可以转换为DWORD)Offset是文件中的函数代码。但是记住,你需要在windows中指针的exetuce地址是PAGE_EXETUCE_READWRITE。然后打电话吧,

fncptr(arg1, arg2, arg3);

如果编译器在第一个代码中失败,请执行以下操作:     fn_t fncptr;     fncptr =(fn_t)((DWORD)MapAddress + 0x(offset));