在下面的代码中,float或double参数不起作用,值始终是错误的。整数和字符串按预期工作。
我将放弃此构造,并尝试其他方法,除非有人可以发现问题。
typedef void(*varfunc)(...);
typedef void(*invokefunc)(int, ...);
varfunc func_table[2];
void register_func(int slot, varfunc cb)
{
func_table[slot] = cb;
}
void invoke_func(int slot, void* a1, void* a2, void* a3, void* a4)
{
func_table[slot](a1, a2, a3, a4);
}
void func_1(float a, int b)
{
printf("%f %d", a, b);
}
void func_2(const char* c)
{
printf("%s", c);
}
int main()
{
register_func(0, (varfunc)func_1);
register_func(1, (varfunc)func_2);
((invokefunc)invoke_func)(0, 1.23f, 456);
((invokefunc)invoke_func)(1, "hello world");
return 0;
}
在提供的代码中,您将invoke_func
的参数指定为空指针,它们的大小可能不同于浮点数或整数,因此将它们传递给func_1
时将导致未定义的行为。我修改了func_1
如下:
void func_1(float* a, int* b)
{
printf("%f %d", *a, *b);
}
现在您可以使用:
float a = 1.23f;
int b = 456;
((invokefunc)invoke_func)(0, &a, &b);
这在我的机器上成功运行。