C++传递函数指针

C++ passing function pointer

本文关键字:指针 传递函数 C++      更新时间:2023-10-16

>我有以下函数

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*'的转换无效 [-允许]

这意味着void*(数据指针(是 x
中指定的类型但是void (*)()(函数指针(正在传递。

所以x改为

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

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

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

指向函数的指针是这样写的:

Ret (*name)(Params)

哪里

  • Ret是脚尖的返回类型
  • name是指针的名称
  • Params是 pointee 参数的列表,就像您在其声明中编写它们一样。

例:

double (*ptr)(int, float)

。可以指向一个函数,该函数采用intfloat并返回double

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

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