可以看出,函數的定義和函數指針的定義非常類似。
一般的化,為了簡化函數指針類型的變量定義,提高程序的可讀性,我們需要把函數指針類型自定義一下。
回調函數可以象普通函數一樣被程序調用,但是只有它被當作參數傳遞給被調函數時才能稱作回調函數。
被調函數的例子:
用戶在調用上面的函數時,需要自己實現一個pcb類型的回調函數:
然后,就可以直接把fCallback當作一個變量傳遞給GetCallBack,
如果賦了不同的值給該參數,那么調用者將調用不同地址的函數。賦值可以發生在運行時,這樣使你能實現動態綁定。參數傳遞規則到目前為止,我們只討論了函數指針及回調而沒有去注意ANSI C/C++的編譯器規范。許多編譯器有幾種調用規范。如在Visual C++中,可以在函數類型前加_cdecl,_stdcall或者_pascal來表示其調用規范(默認為_cdecl)。C++ Builder也支持_fastcall調用規范。調用規范影響編譯器產生的給定函數名,參數傳遞的順序(從右到左或從左到右),堆棧清理責任(調用者或者被調用者)以及參數傳遞機制(堆棧,CPU寄存器等)。
將調用規范看成是函數類型的一部分是很重要的;不能用不兼容的調用規范將地址賦值給函數指針。例如:
// 被調用函數是以int為參數,以int為返回值__stdcall int callee(int);
// 調用函數以函數指針為參數void caller( __cdecl int(*ptr)(int));
// 在p中企圖存儲被調用函數地址的非法操作__cdecl int(*p)(int) = callee; // 出錯
指針p和callee()的類型不兼容,因為它們有不同的調用規范。因此不能將被調用者的地址賦值給指針p,盡管兩者有相同的返回值和參數列例子:
參考自 http://www.shnenglu.com/jjbird/articles/3364.html
Powered by: C++博客 Copyright © silentneil