2015-03-02 86 views
0

什麼是用C void (*)()類型++,怎麼投一個INT這種類型,我發現它的功能是這樣的:什麼是無效(*)()類型,以及如何轉換爲這種類型

function(const char*, long int, void (*)()); 
+0

http://en.wikipedia.org/wiki/Function_pointer – 2015-03-02 12:07:48

+0

它不是特定於C++,它也適用於C。 – rubikonx9 2015-03-02 12:15:16

+0

@ g.tsh:除了在C中,類型將是'void(*)(void)'。 – MSalters 2015-03-02 13:29:18

回答

1

在C/C++中,'maximum munch'規則適用於評估表達式:從起點向左儘可能多地得到一個有效的表達式,然後向右走。

這是一個--- B如何轉化爲(A - ) - B,而不是一個 - ( - B)

回到你的表達

void (*)() 
  • (*) - >你有一個指針
  • (*)() - >你有指向函數什麼沒有參數
  • void (*)() - >你有指向函數什麼不帶 參數並且不返回值

所以,你的函數被傳遞給一個沒有參數的函數的指針,它什麼都不返回。傳遞指針時要小心,因爲它需要完全匹配(返回類型和全部)。

現在,至於爲什麼你會想這樣做,我可以給你一個實際的例子:pthred_create函數原型:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
          void *(*start_routine) (void *), void *arg); 

無效*的start_routine()是胎面將運行什麼(就像它是主要的),這就是爲什麼create函數需要這個函數指針。 某些API使用此方法以獲得更大的靈活性

3

它是一個函數指針:一個沒有參數或返回值的函數的地址。

您無法將int轉換爲此類型。它是一個指針傳遞給自己的代碼的函數調用:

void my_callback() {/* do something */} 

function("Hello", 42, my_callback); 

現在函數可以調用它的參數,就好像它是一個函數,調用與您的「回調」功能的效果。

+0

嗨,我得到錯誤,說'無效轉換從'void(*)()'到'長整型' – user4016367 2015-03-02 12:12:24

+1

@ user4016367:這聽起來像你傳遞一個函數,其中一個整數是預期的,要麼是因爲你得到的參數命令,或者忘了'()'是否打算叫它。檢查參數類型是否與函數聲明匹配。如果你無法弄清楚什麼是錯誤的,請發佈導致錯誤的代碼,這樣我們就不必猜測了。 – 2015-03-02 12:15:21

+0

可能值得一提的是,'void(*)()'對於指針指向函數的指針的作用與'void *'指針指向數據的指針相同。 (然而這個用法是傳統的,這個標準保證了從一個指針到另一個指針到另一個指針的轉換,然後回到原始的,將會起作用。) – 2015-03-02 13:07:17

相關問題