2010-04-14 98 views
11

我已经搜索过,但找不到任何结果(我的术语可能关闭),所以请原谅我,如果之前已经询问过。在没有声明函数指针的情况下调用void *作为函数

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

即。假设要调用的功能与上面的代码输入void(void)

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

,我得到错误C2066:强制转换为函数类型是在VC2008

如果这是可能的非法,语法怎么会不同用于返回类型和多个参数的函数?

回答

22

你投应该是:

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

在一般情况下,这可以通过创建函数指针类型typedef更简单:

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

但是,我应该指出,向函数指针或从函数指针投射普通指针(指向对象的指针)并不严格合法(尽管它是交流全称扩展名)。

+0

正是我在找的,谢谢。 – 2010-04-14 09:26:19

12

当转换为函数类型时,我非常困惑。它更容易和更具可读性的typedef函数指针类型:

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

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

采用reinterpret_cast为您节省一组混乱的括号和< >清楚地调用本身与众不同的类型。