關於函數挪用方法__stdcall和__cdecl詳解。本站提示廣大學習愛好者:(關於函數挪用方法__stdcall和__cdecl詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於函數挪用方法__stdcall和__cdecl詳解正文
關於函數挪用方法__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詳解的全體內容了,願望對年夜家有所贊助,多多支撐~