關于函數(shù)調用方式__stdcall和__cdecl詳解
關于函數(shù)調用方式__stdcall和__cdecl詳解
__stdcall
__cdecl
兩者的相同點與不同點
實例
__stdcall
__stdcall的全稱是standard call。是C++的標準調用方式。
函數(shù)參數(shù)的入棧順序為從右到左入棧。函數(shù)返回時使用retn x指令,其中x為調整堆棧的字節(jié)數(shù)。這種方式叫做自動清棧。即被調用的函數(shù)的參數(shù)個數(shù)是固定的,調用者必須嚴格按照定義傳遞參數(shù),一個不多,一個不少。
__cdecl
__cdecl的全稱是C Declaration,即C語言默認的函數(shù)調用方式。
函數(shù)參數(shù)的入棧順序為從右到左入棧。函數(shù)返回時作用ret指令。由調用者手動清棧。被調用的函數(shù)支持可變參數(shù)。調用者根據(jù)調用時傳入?yún)?shù)的個數(shù),手動平衡堆棧。
兩者的相同點與不同點
相同點
參數(shù)入棧順序相同:從右到左
不同點
堆棧平衡方式不同:__stdcall自動清棧,__cdecl手動清棧。
返回指令不同:_stdcall使用retn x, __cdecl使用ret
編譯后函數(shù)的修飾名不同: 假設有函數(shù)int foo(int a, int b), 采用__stdcall編譯后的函數(shù)名為_foo@8,而采用__cdecl編譯后的函數(shù)名為_foo。
實例
支持可變參數(shù)的函數(shù)必須定義為__cdecl,如:
int printf(char *fmt, ...);
在windef.h中對__stdcall和__cdecl的定義
#define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall #define cdecl _cdecl #ifndef CDECL #define CDECL _cdecl #endif
以上就是小編為大家?guī)淼年P于函數(shù)調用方式__stdcall和__cdecl詳解的全部內(nèi)容了,希望對大家有所幫助,多多支持腳本之家~
相關文章
error LNK2019: 無法解析的外部符號 問題的解決辦法
error LNK2019: 無法解析的外部符號 問題的解決辦法,需要的朋友可以參考一下2013-05-05opengl實現(xiàn)直線掃描算法和區(qū)域填充算法
這篇文章主要為大家詳細介紹了opengl實現(xiàn)直線掃描算法和區(qū)域填充算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04C++字符串拼接效率對比(+=、append、stringstream、sprintf)
這篇文章主要介紹了C++字符串拼接效率對比(+=、append、stringstream、sprintf),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Qt5.9實現(xiàn)簡單的多線程實例(類QThread)
Qt開啟多線程,主要用到類QThread。用一個類繼承QThread,然后重新改寫虛函數(shù)run()。具有一定的參考價值,感興趣的可以了解一下2021-09-09