WINAPI和CALLBACK填坑

在C++中定義回調函數(shù)時經常用到下列語句:

typedef void (CALLBACK *callbackfun) (param1, param2, ... , paramN)

在自己寫的方法去調用回調函數(shù)時,編譯器報錯。后來發(fā)現(xiàn)是方法中缺少了相應的宏定義WINAPI,正確的定義為:

void WINAPI caller(callbackfun myfun1, param2, ... , paramN)

其中,WINAPI和CALLBACK是windows自帶的宏定義:

#define CALLBACK    __stdcall
#define WINAPI      __stdcall

兩者的本質是一樣的。_stdcall是一種堆棧調用方式,該方式約定函數(shù)參數(shù)按照從右到左的順序入棧,被調用的函數(shù)在返回前清理傳送參數(shù)的棧,函數(shù)參數(shù)個數(shù)固定。而c++的缺省調用方式是_cdcel,這樣出錯的原因就很明顯了,回調函數(shù)和caller函數(shù)使用了不同調用方式,導致程序無法通過編譯。

那么什么時候使用_cdcel和_stdcall呢?

  1. 在默認情況下,采用__cdecl方式,因此可以省略.
  2. WINAPI一般用于修飾動態(tài)鏈接庫
  3. CALLBACK僅用于修飾回調函數(shù)

參考文獻

[1].從WINAPI和CALLBACK這兩個宏說開去

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,053評論 0 7
  • 原文地址:C語言函數(shù)調用棧(一)C語言函數(shù)調用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調用。當一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,972評論 1 19
  • 1.面向對象的程序設計思想是什么? 答:把數(shù)據(jù)結構和對數(shù)據(jù)結構進行操作的方法封裝形成一個個的對象。 2.什么是類?...
    少帥yangjie閱讀 5,124評論 0 14
  • 中午在食堂打包了一盒芹菜炒肉和涼拌藕片,吃的很小心,生怕一點浪費,平日里再簡單不過的一餐食堂伙食,今日吃起來格外仔...
    淡心深思閱讀 626評論 0 8
  • 閑時整理東西,又翻開了以前的日記本,看到里面夾著的玫瑰花瓣,思緒飄回多年以前。 似乎兩次提分手,我們都面臨著人生中...
    山半閱讀 1,229評論 1 15

友情鏈接更多精彩內容