在C++中定義回調(diào)函數(shù)時(shí)經(jīng)常用到下列語句:
typedef void (CALLBACK *callbackfun) (param1, param2, ... , paramN)
在自己寫的方法去調(diào)用回調(diào)函數(shù)時(shí),編譯器報(bào)錯暖夭。后來發(fā)現(xiàn)是方法中缺少了相應(yīng)的宏定義WINAPI软瞎,正確的定義為:
void WINAPI caller(callbackfun myfun1, param2, ... , paramN)
其中彻消,WINAPI和CALLBACK是windows自帶的宏定義:
#define CALLBACK __stdcall
#define WINAPI __stdcall
兩者的本質(zhì)是一樣的。_stdcall是一種堆棧調(diào)用方式宙拉,該方式約定函數(shù)參數(shù)按照從右到左的順序入棧宾尚,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的棧,函數(shù)參數(shù)個數(shù)固定。而c++的缺省調(diào)用方式是_cdcel煌贴,這樣出錯的原因就很明顯了御板,回調(diào)函數(shù)和caller函數(shù)使用了不同調(diào)用方式,導(dǎo)致程序無法通過編譯牛郑。
那么什么時(shí)候使用_cdcel和_stdcall呢?
- 在默認(rèn)情況下怠肋,采用__cdecl方式,因此可以省略.
- WINAPI一般用于修飾動態(tài)鏈接庫
- CALLBACK僅用于修飾回調(diào)函數(shù)