欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C和C++的函數(shù)調用約定你知道多少

 更新時間:2022年03月03日 16:48:02   作者:_索倫  
這篇文章主要為大家詳細介紹了C和C++的函數(shù)調用約定,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

調用方式

C/C++函數(shù)有多種調用約定。

C語言:

  • __cdecl
  • __stdcall
  • __fastcall
  • naked
  • __pascal

C++比C語言多了一種:

__thiscall

1. __cdecl

__cdecl調用約定又稱為C調用約定,時C/C++語言缺省的調用約定。參數(shù)按照從右向左的方式入棧,函數(shù)本身不清理棧,此工作由調用者負責,返回值在EAX中。
由于由調用者清理站,所以允許可變參函數(shù)存在。

圖示:

int __cdecl add(int a, int b)
{
	int c = a + b;
	return c;
}
int main(void)
{
	int x = 1, y = 2;
	int z = add(x, y);
	return 0;
}

在這里插入圖片描述

函數(shù)本身不清理棧,此工作由調用者負責

在這里插入圖片描述

2. __stdcall

參數(shù)按照從右至左的方式入棧,函數(shù)自身清理堆棧,返回值在EAX中。

示例:

int __cdecl add(int a, int b)
{
	int c = a + b;
	return c;
}
int main(void)
{
	int x = 1, y = 2;
	int z = add(x, y);
	return 0;
}

在這里插入圖片描述
在這里插入圖片描述

3. __fastcall

顧名思義,__fastcall 的特點就是快,因為它通過CPU寄存器來傳遞參數(shù)。他用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數(shù),剩下的參數(shù)按照從右至左的方式入棧,函數(shù)自身清理堆棧,返回值在EAX中。

4. naked

naked是一個很少見的調用約定,一般不建議使用。編譯器不會給這種函數(shù)增加初始化和清理代碼,更特殊的是你不能用return返回返回值,只能用插入?yún)R編返回結果,此調用約定必須跟_declspec同時使用。例如定義一個求和程序,如:_declspec (naked) int add(int a,int b) ;

5. __pascal

這是pascal語言的調用約定,跟_stdcall一樣,參數(shù)按照從右至左的方式入棧,函數(shù)自身清理堆棧,返回值在EAX中。VS 中已經廢棄了這種調用方式,因此在寫VS程序時,建議使用_stdcall 代替。

6. __thiscall

這是C++語言特有的一種調用方式,用于類成員函數(shù)的調用約定。如果參數(shù)確定,this 指針存放于ECX 寄存器,函數(shù)自身清理堆棧;如果參數(shù)不確定,this 指針在所有參數(shù)入棧后再入棧,調用者清理棧。_thiscall 不是關鍵字,程序員不能使用。參數(shù)按照從右至左的方式入棧。

示例:

class Object
{
private:
	int value;
	int nums;
public:
	Object(int x = 0, int y = 0)
	{
		value = x;
		nums = y;
	}
	~Object() {}
	void Print()const
	{
		cout << value << endl;
	}
};
int main(void)
{
	Object obj(10, 20);
	obj.Print();
	return 0;
}

在這里插入圖片描述

函數(shù)自身清理堆棧

在這里插入圖片描述

對象地址放入寄存器 ECX中

在這里插入圖片描述

名字修飾約定

1.修飾名

“C”或者“C++”函數(shù)在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數(shù)定義或者原型時生成的字符串。有些情況下使用函數(shù)的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數(shù)、構造函數(shù)、析構函數(shù),又如在匯編代碼里調用“C””或“C++”函數(shù)等。

修飾名由函數(shù)名、類名、調用約定、返回類型、參數(shù)共同決定 。

2.名字修飾約定隨調用約定和編譯種類(C或C++)的不同而變化。

1.C編譯時函數(shù)名修飾約定規(guī)則

_stdcall調用約定在輸出函數(shù)名前加上一個下劃線前綴,后面加上一個“@”符號和其參數(shù)的字節(jié)數(shù),格式:_functionname@number;如:_fun@4;

_cdecl調用約定僅在輸出函數(shù)名前加上一個下劃線前綴,格式: _functionname。

_fastcall調用約定在輸出函數(shù)名前加上一個“@”符號,后面也是一個“@”符號和其參數(shù)的字節(jié)數(shù),格式: @functionname@number。

示例:

extern "C"
{
	int __stdcall fun1(int a, int b) { return 0; }
	int __cdecl fun2(int a) { return 0; }
	int __fastcall fun3(int a) { return 0; }
}
int main(void)
{
	fun1(1, 1);
	fun2(2);
	fun3(3);
	return 0;
}

在這里插入圖片描述

2.C++編譯時函數(shù)名修飾約定規(guī)則

__stdcall調用約定:

1.以"?""標識函數(shù)名的開始,后跟函數(shù)名;

2.函數(shù)名后面以"@@YG"標識參數(shù)表的開始,后跟參數(shù)表;

3.參數(shù)表以代號表示:

代號類型
Xvoid
Dchar
Eunsigned char
Fshort
Hint
Iunsigned int
Jlong
Kunsigned long
Mfloat
Ndouble
_Nbool
PA指針

PA表示指針,后面的代號表明指針類型,如果相同類型的指針連續(xù)出現(xiàn),以"o"代替,一個"O"代表一次重復;

4.參數(shù)表的第一項為該函數(shù)的返回值類型,其后依次為參數(shù)的數(shù)據(jù)類型,指針標識在其所指數(shù)據(jù)類型前;

5.參數(shù)表后以"@Z"標識整個名字的結束,如果該函數(shù)無參數(shù),則以"Z"標識結束。

示例:

extern "C++"
{
	void __stdcall fun(int a) { return 0; }
	int __cdecl fun(int a, int b) { return 0; }
	int __fastcall fun() { return 0; }
}
int main(void)
{
	fun(1);
	fun(2, 3);
	fun();
	return 0;
}

在這里插入圖片描述

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!  

您可能感興趣的文章:

相關文章

  • C++編寫實現(xiàn)飛機大戰(zhàn)

    C++編寫實現(xiàn)飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了C++編寫實現(xiàn)飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言實現(xiàn)放煙花的程序

    C語言實現(xiàn)放煙花的程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)放煙花的程序,有音樂播放,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C語言實現(xiàn)登錄注冊和忘記密碼功能

    C語言實現(xiàn)登錄注冊和忘記密碼功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)登錄、注冊和忘記密碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++排序算法之選擇排序解析

    C++排序算法之選擇排序解析

    這篇文章主要介紹了C++排序算法之選擇排序解析,遍歷數(shù)組選擇找到最大值,記錄最大值下標maxindax,然后將最大值與最后一個值交換, 在剩下的待排序數(shù)組中,重新找到最大值,重復第一步,循環(huán)操作,直至數(shù)組排序完成,需要的朋友可以參考下
    2023-10-10
  • C++定義和初始化string對象實例詳解

    C++定義和初始化string對象實例詳解

    這篇文章主要為大家介紹了C++定義和初始化string對象實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Qt定時器和隨機數(shù)詳解

    Qt定時器和隨機數(shù)詳解

    在前一篇中我們介紹了鍵盤和鼠標事件,其實還有一個非常常用的事件,就是定時器事件,如果要對程序實現(xiàn)時間上的控制,那么就要使用到定時器。而隨機數(shù)也是很常用的一個功能,在我們要想產生一個隨機的結果時就要使用到隨機數(shù)。本文我們就來簡單介紹一下定時器和隨機數(shù)。
    2015-06-06
  • C++實現(xiàn)一鍵關閉桌面的示例代碼

    C++實現(xiàn)一鍵關閉桌面的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)一鍵關閉桌面的功能,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • Qt繪制圖表的實現(xiàn)

    Qt繪制圖表的實現(xiàn)

    Qt中提供了強大的2D繪圖系統(tǒng),可以使用同一API實現(xiàn)在屏幕和繪圖設備上進行繪制,本文就詳細的介紹了Qt繪制坐標圖、柱狀圖、折線圖、餅圖、曲線圖、散點圖等,感興趣的可以了解一下
    2021-05-05
  • C++ 中將一維數(shù)組轉成多維的三種方式示例詳解

    C++ 中將一維數(shù)組轉成多維的三種方式示例詳解

    這篇文章主要介紹了C++ 中將一維數(shù)組轉成多維的三種方式,每種方式結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • 利用Matlab復刻掃雷小游戲

    利用Matlab復刻掃雷小游戲

    windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經典游戲,本程序參考《掃雷》的規(guī)則進行了簡化,用Matlab實現(xiàn),感興趣的小伙伴可以學習一下
    2022-03-03

最新評論