__stdcall __cdecl的區別

這裏寫圖片描述
轉自:點我
1,_MSC_VER >= 800
Defines the compiler version. Defined as 1200 for Microsoft Visual C++ 6.0. Always defined
定義編譯器的版本,VC++6.0就是1200

if _MSC_VER > 1000的意思就是如果編譯器版本高於1000(VC++5.0)

2,
一個簡單的dll函數,不帶__stdcall的demo
一個簡單的dll函數,不帶__stdcall的demo

帶__stdcall的demo
帶__stdcall的demo

dumpbin /exports一下dll
dumpbin /exports一下dll

帶__stdcall
帶__stdcall

不帶_stdcall c++默認調用,MFC缺省調用
不帶_stdcall c++默認調用,MFC缺省調用

PS:
__stdcall是Pascal程序的缺省調用方式,通常用於Win32 Api中,函數採用從右到左的壓棧方式,自己在退出時清空堆棧。VC將函數編譯後會在函數名前面加上下劃線前綴,在函數名後加上 “@ “和參數的字節數。

__cdecl
C調用約定(即用__cdecl關鍵字說明)按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於傳送參數的內存棧是由調用者來維護的(正因爲如此,實現可變參數的函數只能使用該調用約定)。另外,在函數名修飾約定方面也有所不同。

__cdecl是C和C++程序的缺省調用方式。每一個調用它的函數都包含清空堆棧的代碼,所以產生的可執行文件大小會比調用_stdcall函數的大。函數採用從右到左的壓棧方式。VC將函數編譯後會在函數名前面加上下劃線前綴。是MFC缺省調用約定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章