C++传递函数指针

C++ passing function pointer

我有以下功能

static void p (){

}

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

void x(void * ptr){

}

我正在尝试以下方法,但它不起作用。

...
x(ptr);

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

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

需要是:

void x(void(*function)())
{
  // Whatever...
}

如果您使用的是 C++11,则可以 std::function:

void x(std::function<void()> function)
{
  // Whatever
}

答案在错误消息中。 void* 不是指向函数的指针,void(*)()(例如)是。您应该按如下方式重写 x

void x(void (*ptr)()) {

}

函数指针是这样写的:

Ret (*name)(Params)

在哪里

  • Ret 是指针对象的 return 类型
  • name是指针的名字
  • Params 是指针对象的参数列表,正如您在其声明中所写的那样。

示例:

double (*ptr)(int, float)

...可以指向一个接受 intfloat 和 returning double.

的函数

我们来看看报错信息:

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

表示void*(一个数据指针)是x,
中指定的类型 但是 void (*)()函数指针)被传递了。

所以把x改成

void x(void (*ptr)())
{
}

void* 不是函数指针,它是一个空指针。

要声明函数指针,请使用 void (*ptr)()

我们可以做一些丑陋的指针魔术,像这样:

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;
}

这很糟糕,但在这种情况下有效。