__stdcall、__cdecl、CALLBACK、WINAPI區別

來源:互聯網
上載者:User

標籤:dll   callback   winapi   stdcall   cdecl   

情景一:先看下Windows開發下的使用:

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
這裡就有一個CALLBACK,轉到定義看一下
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)#define CALLBACK    __stdcall#define WINAPI      __stdcall...

從上面也可以看到在windows平台下WINAPI和CALLBCAK其實是一致的;

情景二:另外我們知道在使用dumpbin DLL符號名的時候,假設有個add函數,輸出時會如[email protected]@[email protected]之類的,如果加上extern ”C“之類的字元,輸出的函數符號就是之前定義的add函數名了,這裡就牽涉到函數調用問題,因為不同的語言和編譯器平台,約定不一樣,比如說函數的形參,預設採用的是壓入棧中,有些是從左往右壓入,有些則是從右往左壓入的,不同的標準是不一樣,所以如果調用就會出現出錯,必須要指明哪一種調用方式,以便編譯器能夠正確識別。

那麼他們有什麼區別呢?

1)首先說下,C調用標準採用的是__cdecl,採用的入棧順序,。。。

      而Delphi採用的是pascal調用標準,即標準約定stdcall,也是Windows預設使用的約定,也就是說在Windows平台下WINAPI、CALLBCAK、stdcall其實都是一致的

2)__stdcall與__cdecl是兩種不同的呼叫慣例,定義了函數參數入棧的順序,由調用函數還是被調用函數將參數彈出棧,以及產生函數修飾名的方法

3)在Windows程式中,回呼函數必須遵從__stdcall呼叫慣例,所以使用的是CALLBACK,當然也可以直接使用__stdcall,主要是便於區分

注意:有關入棧順序,記得前面在看嵌入式方面的書籍中有關壓入棧的順序講解較多,主要他們使用彙編,必須將具體的參數壓入有關寄存器,然後取指的時候可以一一對應,回頭尋找一下,再做深入的解釋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.