關於函式呼叫方式 stdcall和

2022-09-29 05:45:07 字數 1128 閱讀 4878

關於函式呼叫方式__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詳解

本文位址: /ruanjian/c/164657.html

stdcall函式呼叫約定

被這個關鍵字修飾的函式,其引數都是從右向左通過堆疊傳遞的 fastcall 的前面部分由ecx,edx傳 函式呼叫在返回前要由被呼叫者清理堆疊。這個關鍵字主要見於microsoft visual c c gnu的c c 是另外一種修飾方式 attribute stdcall stdcall是函式呼叫...

stdcall函式呼叫約定詳解

對 stdcall 的理解 在c語言中,假設我們有這樣的乙個函式 int function int a,int b 呼叫時只要用result function 1,2 這樣的方式就可以使用這個函式。但是,當高階語言被編譯成計算機可以識別的機器碼時,有乙個問題就凸現出來 在cpu中,計算機沒有辦法知道...

呼叫約定 stdcall

cdecl與 stdcall這兩種呼叫約定之間的主要差別在於由誰來執行對引數的清理工作。如果是 cdecl,那麼主調函式將負責執行清理工作,如果是 stdcall那被調函式將負責執行清理。通常,我們傾向於使用 stdcall,它能夠減少生成 的規模。因為不需要每次呼叫時,都在返回後對esp進行操作,...