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

时间:2010-04-14 07:50:23

标签: c function pointers void

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

我想知道是否有一种简单的方法可以将void*作为C中的函数调用,而无需先声明一个函数指针,然后将函数指针指定为地址;

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

void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */

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

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

3 个答案:

答案 0 :(得分:25)

你的演员应该是:

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

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

typedef void (*func_type)(void);
((func_type) ptr)();
但是,我应该指出,在函数指针中或从函数指针转换普通指针(指向对象的指针)在标准C中并不严格合法(尽管它是一个常见的扩展名)。

答案 1 :(得分:12)

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

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

答案 2 :(得分:11)

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

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