将函数转换为函数指针

use*_*849 2 c

typedef void (*LoopCallback)(int fd, void * arg);

LoopCallback func_ptr = 0;

void call_back(int value)
{
    printf("%d", value);
}

void sys_register_input(LoopCallback call_back)
{
    func_ptr = call_back;
}

int main()
{
    sys_register_input((LoopCallback)call_back);
    func_ptr(33, 0);
}
Run Code Online (Sandbox Code Playgroud)

在其中一个遗留项目中找到此代码,这种转换是否在c中有效?

编辑:调用函数ptr

And*_*ico 5

不,它无效.调用者期望的原型与被调用函数的原型不匹配,因此可能导致未定义的行为.具体结果将取决于编译器和调用约定等因素(被调用的函数可能只是最终看到垃圾进入arg,或者线程堆栈可能被破坏导致崩溃).