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

jay*_*lee 11 c pointers function void

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

我想知道是否有一种简单的方法可以void*在不首先声明函数指针然后为函数指针分配地址的情况下调用C中的函数.

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

void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */
Run Code Online (Sandbox Code Playgroud)

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

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

jam*_*lin 25

你的演员应该是:

((void (*)(void)) ptr)();
Run Code Online (Sandbox Code Playgroud)

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

typedef void (*func_type)(void);
((func_type) ptr)();
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*tos 13

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

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 12

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

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