我試圖調用一個函數,該函數需要一個參數,void(*)(void*, int, const char*)
,但我無法弄清楚如何將這些參數傳遞給該函數。返回void的C++/C函數指針*
例子:
void ptr(int);
int function(int, int, void(*)(int));
我想這樣調用該函數:
function(20, 20, ptr(20));
這可能嗎?
我試圖調用一個函數,該函數需要一個參數,void(*)(void*, int, const char*)
,但我無法弄清楚如何將這些參數傳遞給該函數。返回void的C++/C函數指針*
例子:
void ptr(int);
int function(int, int, void(*)(int));
我想這樣調用該函數:
function(20, 20, ptr(20));
這可能嗎?
你正在做一件不正確的事情 - 你試圖在調用'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);
慣用的伎倆是使用typedef簽名:
typedef void signature_t (void*, int, const char*);
請注意,如果沒有typedef
,則語法就像函數聲明。它聲明signature_t
作爲函數的typedef,因此在實踐中您總是會使用指向signature_t
的指針。
然後你就可以宣佈你的 「高階」 功能
int function (int, int, signature_t*);
參見this reply。
除非我完全誤解了你的代碼,你試圖通過做
function(20, 20, ptr(20));
這是不正確的,非法的傳遞一個函數指針與參數。爲了傳遞一個函數作爲參數傳遞到另一個函數,你必須遵循以下語法
function(20, 20, &ptr);
or
function(20, 20, ptr);
即使我會離開電子書籍的「&」的可讀性
你不能傳遞PTR(20 )到這個函數,因爲你只能將指針傳遞給函數,而不能將指針傳遞給參數。你可以閱讀函子,他們會幫助你解決這個問題。或者其他的解決辦法是將簽名改爲
int function(int, int, void(*)(void));
而寫功能
void ptr_wrap(void) {ptr(20);}
,所以你可以調用function(20, 20, ptr_wrap);
。但仿函數可以更優雅的方式解決這個問題。
ptr(20)
是ptr
的返回值,當您將20
傳遞給它時。如果你想通過這個函數(而不是它的返回值),你應該只寫function(20,20,ptr);
非常感謝大家,我明白了。我從這個問題中學到了很多關於函數的指針。再次,非常感謝! – 2012-02-04 19:28:26