簡體   English   中英

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*'無效轉換 [-fpermissive]

這意味着void*數據指針)是x指定的類型,
但是void (*)()函數指針)被傳遞了。

所以將x改為

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

答案在錯誤消息中。 void*不是指向函數的指針, void(*)() (例如)是。 您應該按如下方式重寫x

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

}

一個指向函數的指針是這樣寫的:

Ret (*name)(Params)

在哪里

  • Ret是指針的返回類型
  • name是指針的名稱
  • Params是指針對象的參數列表,正如您將它們寫在其聲明中一樣。

例子 :

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

這很糟糕,但它在這種情況下有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM