2012-02-04 240 views
5

我試圖調用一個函數,該函數需要一個參數,void(*)(void*, int, const char*),但我無法弄清楚如何將這些參數傳遞給該函數。返回void的C++/C函數指針*

例子:

void ptr(int); 
int function(int, int, void(*)(int)); 

我想這樣調用該函數:

function(20, 20, ptr(20)); 

這可能嗎?

+0

非常感謝大家,我明白了。我從這個問題中學到了很多關於函數的指針。再次,非常感謝! – 2012-02-04 19:28:26

回答

9

你正在做一件不正確的事情 - 你試圖在調用'function'之前調用你的'ptr'函數。什麼你應該做的是使用傳遞指針從這樣的「功能」只是一個指針傳遞給「PTR」和調用「PTR」:

void ptr(int x) 
{ 
    printf("from ptr [%d]\n", x); 
} 

int function(int a, int b , void (*func)(int)) 
{ 
    printf("from function a=[%d] b=[%d]\n", a, b); 
    func(a); // you must invoke function here 

    return 123; 
} 


void main() 
{ 
    function(10, 2, &ptr); 
    // or 
    function(20, 2, ptr); 
} 

這給:

from function a=[10] b=[2] 
from ptr [10] 
from function a=[20] b=[2] 
from ptr [20] 

這是你想

function(20, 20, ptr(20)); 

工作 - 你就必須有某事像:

// 'ptr' must return sth (int for example) 
// if you want its ret val to be passed as arg to 'function' 
// this way you do not have to invoke 'ptr' from within 'function' 
int ptr(int); 
int function(int, int , int); 
1

的函數調用正確的語法是:

function(20,20, &ptr); 

如果你感到失落,嘗試一些tutorials,或this

+4

如果你想要的話,你實際上可以離開'&' – 2012-02-04 18:47:08

+0

@SethCarnegie你指的是什麼編譯器?據我記憶,gcc不會對此非常友好。無論如何,感覺更加明顯,當你添加'&'(我的意見)時,你想說什麼。 – Vyktor 2012-02-04 18:49:26

+1

gcc處理(不會把'&')就好,它的標準C. – Mat 2012-02-04 18:50:42

4

慣用的伎倆是使用typedef簽名:

typedef void signature_t (void*, int, const char*); 

請注意,如果沒有typedef,則語法就像函數聲明。它聲明signature_t作爲函數的typedef,因此在實踐中您總是會使用指向signature_t的指針。

然後你就可以宣佈你的 「高階」 功能

int function (int, int, signature_t*); 

參見this reply

+3

對於'typedef void(signature_t)(void *,int,const char *)'是不是正確的語法?無論如何+1''typedef'主意:) – Vyktor 2012-02-04 18:47:51

+1

@Vyktor:這裏不需要括號。答案中的語法是正確的。 – jpalecek 2012-02-04 19:07:27

+0

我用通知解釋了語法更新了我的答案。 – 2012-02-04 19:23:40

1

除非我完全誤解了你的代碼,你試圖通過做

function(20, 20, ptr(20)); 

這是不正確的,非法的傳遞一個函數指針與參數。爲了傳遞一個函數作爲參數傳遞到另一個函數,你必須遵循以下語法

function(20, 20, &ptr); 

or 

function(20, 20, ptr); 

即使我會離開電子書籍的「&」的可讀性

0

你不能傳遞PTR(20 )到這個函數,因爲你只能將指針傳遞給函數,而不能將指針傳遞給參數。你可以閱讀函子,他們會幫助你解決這個問題。或者其他的解決辦法是將簽名改爲

int function(int, int, void(*)(void)); 

而寫功能

void ptr_wrap(void) {ptr(20);} 

,所以你可以調用function(20, 20, ptr_wrap);。但仿函數可以更優雅的方式解決這個問題。

0

ptr(20)ptr的返回值,當您將20傳遞給它時。如果你想通過這個函數(而不是它的返回值),你應該只寫function(20,20,ptr);