将void *作为函数调用而不声明函数指针

我已经搜索过但找不到任何结果(我的术语可能已关闭)所以请原谅我,如果之前已经提出过这个问题。

我想知道是否有一种简单的方法可以在没有首先声明函数指针然后为函数指针指定地址的情况下将void*作为C函数调用。

即。 假设要调用的函数是void(void)

 void *ptr; ptr = ; ((void*())ptr)(); /* call ptr as function here */ 

用上面的代码,我得到错误C2066:在VC2008中强制转换为函数类型是非法

如果可能,具有返回类型和多个参数的函数的语法有何不同?

你的演员应该是:

 ((void (*)(void)) ptr)(); 

通常,通过为函数指针类型创建typedef可以使这更简单:

 typedef void (*func_type)(void); ((func_type) ptr)(); 

但是,我应该指出,向函数指针或从函数指针投射普通指针(指向对象的指针)在标准C中并不严格合法(尽管它是常见的扩展)。

在转换为函数类型时,我非常困惑。 键入dede函数指针类型更容易,更易读:

 void *ptr = ...; typedef void (*void_f)(void); ((void_f)ptr)(); 

在C ++中: reinterpret_cast< void(*)() > (ptr) ()

使用reinterpret_cast可以为您节省一组令人困惑的括号,而< >明确地将类型与调用本身区分开来。