使用提供的可变参数传递C回调函数会产生奇怪的结果

问题描述 投票:0回答:1

在下面的代码中,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;
}
c callback arguments variadic
1个回答
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);

这在我的机器上成功运行。

© www.soinside.com 2019 - 2024. All rights reserved.