13

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

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

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

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

使用上面的代码,我得到错误 C2066: cast to function type is wrong in VC2008

如果这是可能的,具有返回类型和多个参数的函数的语法会有什么不同?

4

3 回答 3

31

你的演员应该是:

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

一般来说,这可以通过typedef为函数指针类型创建一个来简化:

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

然而,我应该指出,在标准 C 中将普通指针(指向对象的指针)转换为函数指针或从函数指针转换为严格合法的(尽管它是一个常见的扩展)。

于 2010-04-14T07:55:15.590 回答
13

转换为函数类型时,我感到非常困惑。typedef 函数指针类型更容易,更易读:

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();
于 2010-04-14T07:54:04.357 回答
12

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

的使用为reinterpret_cast您节省了一组令人困惑的括号,并且< >清楚地将类型与调用本身区分开来。

于 2010-04-14T08:39:08.230 回答