關(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解
關(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解
__stdcall
__cdecl
兩者的相同點(diǎn)與不同點(diǎn)
實(shí)例
__stdcall
__stdcall的全稱是standard call。是C++的標(biāo)準(zhǔn)調(diào)用方式。
函數(shù)參數(shù)的入棧順序?yàn)閺挠业阶笕霔?。函?shù)返回時(shí)使用retn x指令,其中x為調(diào)整堆棧的字節(jié)數(shù)。這種方式叫做自動(dòng)清棧。即被調(diào)用的函數(shù)的參數(shù)個(gè)數(shù)是固定的,調(diào)用者必須嚴(yán)格按照定義傳遞參數(shù),一個(gè)不多,一個(gè)不少。
__cdecl
__cdecl的全稱是C Declaration,即C語言默認(rèn)的函數(shù)調(diào)用方式。
函數(shù)參數(shù)的入棧順序?yàn)閺挠业阶笕霔?。函?shù)返回時(shí)作用ret指令。由調(diào)用者手動(dòng)清棧。被調(diào)用的函數(shù)支持可變參數(shù)。調(diào)用者根據(jù)調(diào)用時(shí)傳入?yún)?shù)的個(gè)數(shù),手動(dòng)平衡堆棧。
兩者的相同點(diǎn)與不同點(diǎn)
相同點(diǎn)
參數(shù)入棧順序相同:從右到左
不同點(diǎn)
堆棧平衡方式不同:__stdcall自動(dòng)清棧,__cdecl手動(dòng)清棧。
返回指令不同:_stdcall使用retn x, __cdecl使用ret
編譯后函數(shù)的修飾名不同: 假設(shè)有函數(shù)int foo(int a, int b), 采用__stdcall編譯后的函數(shù)名為_foo@8,而采用__cdecl編譯后的函數(shù)名為_foo。
實(shí)例
支持可變參數(shù)的函數(shù)必須定義為__cdecl,如:
int printf(char *fmt, ...);
在windef.h中對(duì)__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(guān)于函數(shù)調(diào)用方式__stdcall和__cdecl詳解的全部?jī)?nèi)容了,希望對(duì)大家有所幫助,多多支持腳本之家~
相關(guān)文章
c++ 移動(dòng)構(gòu)造相關(guān)總結(jié)
這篇文章主要介紹了c++ 移動(dòng)構(gòu)造的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下2021-02-02
C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解
這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
Unix下C程序內(nèi)存泄漏檢測(cè)工具Valgrind的安裝與使用詳解
以下是對(duì)Unix下C程序內(nèi)存泄漏檢測(cè)工具Valgrind的安裝與使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
C++調(diào)用C接口的實(shí)現(xiàn)示例
這篇文章主要介紹了C++調(diào)用C接口的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

