最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

調(diào)用方式

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

C語言:

  • __cdecl
  • __stdcall
  • __fastcall
  • naked
  • __pascal

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

__thiscall

1. __cdecl

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

在這里插入圖片描述

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

5. __pascal

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

6. __thiscall

這是C++語言特有的一種調(diào)用方式,用于類成員函數(shù)的調(diào)用約定。如果參數(shù)確定,this 指針存放于ECX 寄存器,函數(shù)自身清理堆棧;如果參數(shù)不確定,this 指針在所有參數(shù)入棧后再入棧,調(diào)用者清理棧。_thiscall 不是關(guān)鍵字,程序員不能使用。參數(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ù)在內(nèi)部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數(shù)定義或者原型時生成的字符串。有些情況下使用函數(shù)的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數(shù)、構(gòu)造函數(shù)、析構(gòu)函數(shù),又如在匯編代碼里調(diào)用“C””或“C++”函數(shù)等。

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

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

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

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

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

_fastcall調(diào)用約定在輸出函數(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調(diào)用約定:

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

2.函數(shù)名后面以"@@YG"標(biāo)識參數(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"代表一次重復(fù);

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

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

示例:

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;
}

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • exit和atexit的區(qū)別詳細(xì)解析

    exit和atexit的區(qū)別詳細(xì)解析

    以下是對exit與atexit的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • C語言中的字符型數(shù)據(jù)與ASCII碼表

    C語言中的字符型數(shù)據(jù)與ASCII碼表

    這篇文章主要介紹了C語言中的字符型數(shù)據(jù)與ASCII碼表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C++?內(nèi)存泄漏調(diào)試方式

    C++?內(nèi)存泄漏調(diào)試方式

    這篇文章主要介紹了C++?內(nèi)存泄漏調(diào)試方式,C++和其他高級語言不同,需要自行管理內(nèi)存,項目大調(diào)用多,下文我們就來看看C++?內(nèi)存泄漏調(diào)試方式分享,需要的小伙伴可以參考一下
    2022-04-04
  • 基于C++17實現(xiàn)的手寫線程池

    基于C++17實現(xiàn)的手寫線程池

    本文主要介紹了基于C++17實現(xiàn)的手寫線程池,自己實現(xiàn)了Any類,Semaphore類以及Result類的開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • C++入門之內(nèi)存處理詳解

    C++入門之內(nèi)存處理詳解

    這篇文章主要為大家介紹了C++入門之內(nèi)存處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C/C++ Crypto密碼庫調(diào)用的實現(xiàn)方法

    C/C++ Crypto密碼庫調(diào)用的實現(xiàn)方法

    Crypto 庫是C/C++的加密算法庫,這個加密庫很流行,基本上涵蓋了市面上的各類加密解密算法,感興趣的可以參考一下
    2021-06-06
  • Qt無邊框窗口拖拽和陰影的實現(xiàn)方法

    Qt無邊框窗口拖拽和陰影的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Qt無邊框窗口拖拽和陰影的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++類和對象補充

    C++類和對象補充

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10
  • 詳解C++虛函數(shù)的工作原理

    詳解C++虛函數(shù)的工作原理

    這篇文章主要介紹了C++虛函數(shù)的工作原理的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C++中putchar與getchar函數(shù)的細(xì)節(jié)及運用

    C++中putchar與getchar函數(shù)的細(xì)節(jié)及運用

    C語言提供putchar函數(shù),用于給終端輸出一個字符;getchar函數(shù),可以從終端接收用戶輸入的一個字符,本文給大家分享C++中putchar與getchar函數(shù)的細(xì)節(jié)及運用,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評論

札达县| 湘潭县| 若尔盖县| 乌兰察布市| 广元市| 青浦区| 永新县| 晋城| 太康县| 昌吉市| 临朐县| 肥东县| 漳浦县| 祁东县| 九寨沟县| 攀枝花市| 安宁市| 平江县| 新闻| 佳木斯市| 孙吴县| 迁西县| 青阳县| 黄冈市| 吉隆县| 凤台县| 高雄县| 泰顺县| 乌什县| 江孜县| 朝阳区| 博野县| 榆树市| 措美县| 东阿县| 景泰县| 慈利县| 石河子市| 霍邱县| 抚远县| 阿鲁科尔沁旗|