C ++传递函数指针

时间:2015-02-05 16:05:29

标签: c++ function-pointers

我有以下功能

static void p (){

}

我想将函数指针p传递给函数x。

void x(void * ptr){

}

我正在尝试以下操作,但它无效。

...
x(ptr);

注意x和p在不同的类中。 我收到以下编译错误。

invalid conversion from 'void (*)()' to 'void*' [-fpermissive]

5 个答案:

答案 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)

...可以指向一个功能intfloat并返回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;
}

这很糟糕,但它适用于这种情况。