我有以下功能
static void p (){
}
我想将函数指针p传递给函数x。
void x(void * ptr){
}
我正在尝试以下操作,但它无效。
...
x(ptr);
注意x和p在不同的类中。 我收到以下编译错误。
invalid conversion from 'void (*)()' to 'void*' [-fpermissive]
答案 0 :(得分:4)
您需要了解如何阅读错误消息。
从
的无效转换'void (*)()'
到'void*'
[-fpermissive]
这意味着void*
(数据指针)是您在x
中指定的类型,
但是您要传递void (*)()
(函数指针)。
只需将x
更改为
void x(void (*ptr)())
{
}
答案 1 :(得分:3)
需要:
void x(void(*function)())
{
// Whatever...
}
如果你正在使用C ++ 11,你可以std::function:
void x(std::function<void()> function)
{
// Whatever
}
答案 2 :(得分:1)
答案在错误消息中。 void*
不是指向函数的指针,void(*)()
(例如)是。您应该按如下方式重写x
:
void x(void (*ptr)()) {
}
以这种方式写入指向函数的指针:
Ret (*name)(Params)
其中
Ret
是指针对象的返回类型name
是指针的名称Params
是指针对象的参数列表,就像你在声明中写的一样。示例:
double (*ptr)(int, float)
...可以指向一个功能int
和float
并返回double
。
答案 3 :(得分:1)
void*
不是函数指针,它是一个void指针。
要声明函数指针,请使用void (*ptr)()
。
答案 4 :(得分:1)
我们可以做一些丑陋的指针魔术,就像这样:
static void function1( char* c ) {
printf( "%s", c );
}
void function2( void* ptr ) {
void(* func)(char*) = (void(*)(char*))ptr;
func( "a" );
}
int _tmain(int argc, _TCHAR* argv[])
{
void* f = function1;
function2( f );
return 0;
}
这很糟糕,但它适用于这种情况。