關于函數調用方式__stdcall和__cdecl詳解
關于函數調用方式__stdcall和__cdecl詳解
__stdcall
__cdecl
兩者的相同點與不同點
實例
__stdcall
__stdcall的全稱是standard call。是C++的標準調用方式。
函數參數的入棧順序為從右到左入棧。函數返回時使用retn x指令,其中x為調整堆棧的字節(jié)數。這種方式叫做自動清棧。即被調用的函數的參數個數是固定的,調用者必須嚴格按照定義傳遞參數,一個不多,一個不少。
__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
以上就是小編為大家?guī)淼年P于函數調用方式__stdcall和__cdecl詳解的全部內容了,希望對大家有所幫助,多多支持我們~
上一篇:c++加法高精度算法的簡單實現
欄 目:C語言
本文標題:關于函數調用方式__stdcall和__cdecl詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2054.html
您可能感興趣的文章
- 04-02c語言函數調用后清空內存 c語言調用函數刪除字符
- 04-02c語言的正則匹配函數 c語言正則表達式函數庫
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言中對數函數的表達式 c語言中對數怎么表達
- 04-02c語言用函數寫分段 用c語言表示分段函數
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段函數
- 04-02C語言中怎么打出三角函數 c語言中怎么打出三角函數的值
- 04-02c語言調用函數求fibo C語言調用函數求階乘


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?