程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 關於函數挪用方法__stdcall和__cdecl詳解

關於函數挪用方法__stdcall和__cdecl詳解

編輯:關於C++

關於函數挪用方法__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詳解的全體內容了,願望對年夜家有所贊助,多多支撐~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved