關于函數調用方式__stdcall和__cdecl詳解
__stdcall
__cdecl
兩者的相同點與不同點
實例
__stdcall
__stdcall的全稱是standard call。是C++的標準調用方式。
函數參數的入棧順序為從右到左入棧。函數返回時使用retn x指令,其中x為調整堆棧的字節數。這種方式叫做自動清棧。即被調用的函數的參數個數是固定的,調用者必須嚴格按照定義傳遞參數,一個不多,一個不少。
__cdecl
__cdecl的全稱是C Declaration,即C語言默認的函數調用方式。
函數參數的入棧順序為從右到左入棧。函數返回時作用ret指令。由調用者手動清棧。被調用的函數支持可變參數。調用者根據調用時傳入參數的個數,手動平衡堆棧。
兩者的相同點與不同點
相同點
參數入棧順序相同:從右到左
不同點
堆棧平衡方式不同:__stdcall自動清棧,__cdecl手動清棧。
返回指令不同:_stdcall使用retn x, __cdecl使用ret
編譯后函數的修飾名不同: 假設有函數int foo(int a, int b), 采用__stdcall編譯后的函數名為_foo@8,而采用__cdecl編譯后的函數名為_foo。
實例
支持可變參數的函數必須定義為__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
以上就是小編為大家帶來的關于函數調用方式__stdcall和__cdecl詳解的全部內容了,希望對大家有所幫助,多多支持武林網~
新聞熱點
疑難解答
圖片精選