我已经搜索过但找不到任何结果(我的术语可能已经关闭),请原谅我,如果之前已经提出过这样的话。
我想知道是否有一种简单的方法可以将void*
作为C中的函数调用,而无需先声明一个函数指针,然后将函数指针指定为地址;
即。假设要调用的函数是类型void(void)
void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */
使用上面的代码,我得到错误C2066:在VC2008中强制转换为函数类型
如果可能,具有返回类型和多个参数的函数的语法有何不同?
答案 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
的使用为您节省了一组令人困惑的括号,< >
明确地将类型与呼叫本身区分开来。