C語言幾項主要的呼叫慣例

2021-08-10 21:38:47 字數 807 閱讀 8850

呼叫慣例

出棧方引數傳遞

名字修飾

cdecl

函式呼叫方

從右至左的順序壓引數入棧

下劃線+函式名

stdcall

函式本身

從右至左的順序壓引數入棧

下劃線+函式名+@+引數位元組數,

如函式int func(int a, double b)的

修飾名是_func@12

fastcall

函式本身

頭兩個dword(4位元組)型別

或者占用更少位元組的引數被

放入暫存器,其他剩下的參

數按從右到左的順序壓入棧

@+函式名+@+引數的位元組數

pascal

函式本身

從左至右的順序壓引數入棧

較為複雜,參加pascal文件

此外,不少編譯器還提供一種稱為naked call的呼叫慣例,這種呼叫慣例用在特殊的場合,其特點是編譯器不產生任何保護暫存器的**,故稱naked call,

對c++而言,以上幾種呼叫慣例的名字修飾策略都略有所改變,因為c++支援函式過載以及命名空間和成員函式等等,因此實際上乙個 函式名可以對應多個

函式定義,那麼上面提到的名字修飾策略顯然無法區分各個不同同名函式定義的。所以c++有自己更加複雜的名字修飾策略。

最後,c++還有自己一種特殊的呼叫慣例,稱為thiscall,專門用於類成員函式的呼叫,其特點隨編譯器不同而不同,在vc裡是將this指標存放於eax暫存器,

引數從右到左壓棧,而對於gcc、thiscall和cdecl完全一樣,只是將this看作是函式的第一引數。

VC 中的函式呼叫慣例

我們知道在進行函式呼叫時,有幾種呼叫方法,主要分為c式,pascal式.在c和c 中c式呼叫是預設的,類的成員函式預設呼叫為 stdcall。二者是有區別的,下面我們用例項說明一下 1.cdecl c和c 預設呼叫方式 例子 void input int m,int n 相當於void cdecl ...

VC 中的函式呼叫慣例

我們知道在進行函式呼叫時,有幾種呼叫方法,主要分為c式,pascal式.在c和c 中c式呼叫是預設的,類的成員函式預設呼叫為 stdcall。二者是有區別的,下面我們用例項說明一下 1.cdecl c和c 預設呼叫方式 例子 void input int m,int n 相當於void cdecl ...

c語言呼叫cpp函式 C語言 函式的遞迴呼叫

乙個函式在呼叫的過程 現直接或者間接呼叫該函式本身的情況,稱為遞迴呼叫,這種函式稱為遞迴函式 在寫遞迴函式時,需要解決如下兩個問題 1 遞迴的出口條件 2 遞迴公式 遞迴函式的 一般為 if 遞迴出口條件 返回符合出口條件的函式值或輸出結果 else 遞迴公式 雖然演算法一致,但n不同,y不同,在記...