C語言 函式的呼叫約定

2021-10-14 16:42:06 字數 748 閱讀 4784

呼叫約定(calling convention)決定以下內容:函式引數的壓棧順序,由呼叫者還是被呼叫者把引數彈出棧,以及產生函式修飾名的方法。mfc支援以下呼叫約定:

按從右至左的順序壓引數入棧,由呼叫者把引數彈出棧。對於「c」函式或者變數,修飾名是在函式名前加下劃線。對於「c++」函式,有所不同。

如函式void test(void)的修飾名是_test;對於不屬於乙個類的「c++」全域性函式,修飾名是?test@@zaxxz。

這是mfc預設呼叫約定。由於是呼叫者負責把引數彈出棧,所以可以給函式定義個數不定 的引數,如printf函式。

按從右至左的順序壓引數入棧,由被呼叫者把引數彈出棧。對於「c」函式或者變數,修 飾名以下劃線為字首,然後是函式名,然後是符號「@」及引數的位元組數,如函式int f unc(int a, double b)的修飾名是_func@12。對於「c++」函式,則有所不同。所有的win32 api函式都遵循該約定。

顧名思義,__fastcall 的特點就是快,因為它通過 cpu 暫存器來傳遞引數。他用 ecx 和 edx 傳送前兩個雙字(dword)或更小的引數,剩下的引數按照從右至左的方式入棧,函式自身清理堆疊,返回值在 eax 中。

naked 是乙個很少見的呼叫約定,一般不建議使用。編譯器不會給這種函式增加初始化和清理**,更特殊的是,你不能用return返回返回值,只能用插入彙編返回結果,此呼叫約定必須跟 __declspec 同時使用。例如定義乙個求和程式,如__declspec(naked) int add(int a,int b);。

C語言函式呼叫約定

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

C語言函式呼叫約定

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

C語言函式呼叫約定

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