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

C/C++函數(shù)調用的幾種方式總結

 更新時間:2013年12月20日 08:48:03   作者:  
本篇文章主要是對C/C++函數(shù)調用的幾種方式進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助

調用函數(shù)時,計算機常用棧來存儲傳遞給函數(shù)的參數(shù)。

棧是一種先進后出的數(shù)據(jù)結構,棧有一個存儲區(qū)、一個棧頂指針。棧頂指針指向堆棧中第一個可用的數(shù)據(jù)項(被稱為棧頂)。用戶可以在棧頂上方向棧中加入數(shù)據(jù),這個操作被稱為壓棧(Push),壓棧以后,棧頂自動變成新加入數(shù)據(jù)項的位置,棧頂指針也隨之修改。用戶也可以從堆棧中取走棧頂,稱為彈出棧(pop),彈出棧后,棧頂下的一個元素變成棧頂,棧頂指針隨之修改。函數(shù)調用時,調用者依次把參數(shù)壓棧,然后調用函數(shù),函數(shù)被調用以后,在堆棧中取得數(shù)據(jù),并進行計算。函數(shù)計算結束以后,或者調用者、或者函數(shù)本身修改堆棧,使堆?;謴驮b。

在參數(shù)傳遞中,有兩個重要的問題必須要明確說明:

1. 當參數(shù)個數(shù)多于一個時,按照什么順序把參數(shù)壓入堆棧;

2. 函數(shù)調用后,由誰來把堆?;謴驮瓲?。


在高級語言中,就是通過函數(shù)的調用方式來說明這兩個問題的。常見的調用方式有:

stdcall

cdecl

fastcall

thiscall

thiscall

naked call


下面就分別介紹這幾種調用方式:
 

1. stdcall

stdcall調用方式又被稱為Pascal調用方式。在Microsoft C++系列的C/C++編譯器中,使用PASCAL宏,WINAPI宏和CALLBACK宏來指定函數(shù)的調用方式為stdcall。

stdcall調用方式的函數(shù)聲明為:

int _stdcall function(int a, int b);

stdcall的調用方式意味著:

(1) 參數(shù)從右向左一次壓入堆棧

(2) 由被調用函數(shù)自己來恢復堆棧

(3) 函數(shù)名自動加前導下劃線,后面緊跟著一個@,其后緊跟著參數(shù)的尺寸

上面那個函數(shù)翻譯成匯編語言將變成:

push b     先壓入第二個參數(shù)

push a     再壓入第一個參數(shù)

call function   調用函數(shù)


在編譯時,此函數(shù)的名字被翻譯為_function@8


2. cdecl

cdecl調用方式又稱為C調用方式,是C語言缺省的調用方式,它的語法為:

int function(int a, int b)  // 不加修飾符就是C調用方式

int _cdecl function(int a, int b)  // 明確指定用C調用方式

cdecl的調用方式?jīng)Q定了:

(1) 參數(shù)從右向左依次壓入堆棧

(2) 由調用者恢復堆棧

(3) 函數(shù)名自動加前導下劃線

由于是由調用者來恢復堆棧,因此C調用方式允許函數(shù)的參數(shù)個數(shù)是不固定的,這是C語言的一大特色。

此方式的函數(shù)被翻譯為:

push b   // 先壓入第二個參數(shù)

push a   // 在壓入第一個參數(shù)

call funtion  // 調用函數(shù)

add  esp, 8   // 清理堆棧


在編譯時,此方式的函數(shù)被翻譯成:_function
 

3. fastcall

fastcall 按照名字上理解就可以知道,它是一種快速調用方式。此方式的函數(shù)的第一個和第二個DWORD參數(shù)通過ecx和edx傳遞,

后面的參數(shù)從右向左的順序壓入棧。

被調用函數(shù)清理堆棧。

函數(shù)名修個規(guī)則同stdcall

其聲明語法為:

int fastcall function(int a, int b);


4. thiscall

thiscall 調用方式是唯一一種不能顯示指定的修飾符。它是c++類成員函數(shù)缺省的調用方式。由于成員函數(shù)調用還有一個this指針,因此必須用這種特殊的調用方式。

thiscall調用方式意味著:

參數(shù)從右向左壓入棧。

如果參數(shù)個數(shù)確定,this指針通過ecx傳遞給被調用者;如果參數(shù)個數(shù)不確定,this指針在所有參數(shù)壓入棧后被壓入棧。

參數(shù)個數(shù)不定的,由調用者清理堆棧,否則由函數(shù)自己清理堆棧。

可以看到,對于參數(shù)個數(shù)固定的情況,它類似于stdcall,不定時則類似于cdecl。
 

5. naked call

是一種比較少見的調用方式,一般高級程序設計語言中不常見。


函數(shù)的聲明調用方式和實際調用方式必須一致,必然編譯器會產(chǎn)生混亂。


函數(shù)名字修改規(guī)則:

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

__stdcall調用約定在輸出函數(shù)名前加上一個下劃線前綴,后面加上一個“@”符號和其參數(shù)的字節(jié)數(shù),格式為_function@8。

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

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

它們均不改變輸出函數(shù)名中的字符大小寫,這和PASCAL調用約定不同,PASCAL約定輸出的函數(shù)名無任何修飾且全部大寫。

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

__stdcall調用約定:

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

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

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

X--void ,

D--char,

E--unsigned char,

F--short,

H--int,

I--unsigned int,

J--long,

K--unsigned long,

M--float,

N--double,

_N--bool,

....

PA--表示指針,后面的代號表明指針類型,如果相同類型的指針連續(xù)出現(xiàn),以“0”代替,一個“0”代

表一次重復;

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

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

其格式為“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如

int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”

void Test2() -----“?Test2@@YGXXZ”


__cdecl調用約定:

規(guī)則同上面的_stdcall調用約定,只是參數(shù)表的開始標識由上面的“@@YG”變?yōu)椤癅@YA”。
 

__fastcall調用約定:

規(guī)則同上面的_stdcall調用約定,只是參數(shù)表的開始標識由上面的“@@YG”變?yōu)椤癅@YI”。


VC++對函數(shù)的省缺聲明是"__cedcl",將只能被C/C++調用。

相關文章

  • C++模板特例化應用實例

    C++模板特例化應用實例

    這篇文章主要介紹了C++模板特例化應用實例,是非常重要的一個概念,需要的朋友可以參考下
    2014-08-08
  • C語言入門篇--關鍵字static詳解

    C語言入門篇--關鍵字static詳解

    本篇文章是C語言系列基礎篇,C語言中,static是用來修飾變量和函數(shù):1.修飾局部變量–>靜態(tài)局部變量2.修飾全局變量–>靜態(tài)全局變量3.修飾函數(shù)–>靜態(tài)函數(shù)
    2021-08-08
  • Linux下動靜態(tài)庫的打包與使用指南(C/C++)

    Linux下動靜態(tài)庫的打包與使用指南(C/C++)

    c++是面向對象的編程語言,比較方便實現(xiàn)某些第三方庫,比如翻譯其他面向對象語言的代碼,比c語言要方便的多,下面這篇文章主要給大家介紹了關于Linux下C/C++動靜態(tài)庫的打包與使用的相關資料,需要的朋友可以參考下
    2023-02-02
  • C++構造函數(shù)拋出異常需要注意的地方

    C++構造函數(shù)拋出異常需要注意的地方

    這篇文章主要介紹了C++構造函數(shù)拋出異常需要注意的地方,幫助大家更好的理解和學習c++,感興趣的朋友可以了解下
    2020-08-08
  • Qt出現(xiàn)假死凍結現(xiàn)象的原因及解決方法

    Qt出現(xiàn)假死凍結現(xiàn)象的原因及解決方法

    應用程序出現(xiàn)假死或凍結現(xiàn)象通常是由于一些常見問題所導致的,本文主要介紹了Qt出現(xiàn)假死凍結現(xiàn)象的原因及解決方法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • C++中vector與remove()函數(shù)詳解

    C++中vector與remove()函數(shù)詳解

    這篇文章主要介紹了C++中vector與remove()函數(shù),本文實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C語言實現(xiàn)貪吃蛇游戲代碼

    C語言實現(xiàn)貪吃蛇游戲代碼

    大家好,本篇文章主要講的是C語言實現(xiàn)貪吃蛇游戲代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C語言打印某一年中某月的日歷

    C語言打印某一年中某月的日歷

    本文詳細講解了C語言打印某一年中某月的日歷,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • C++中智能指針最常用的shared_ptr和unique_ptr

    C++中智能指針最常用的shared_ptr和unique_ptr

    C++中的智能指針最常用的是shared_ptr和unique_ptr,C++新手最常問的問題是我從一個函數(shù)中拿到unique_ptr,但要轉成shared_ptr才能使用,要怎么轉換?同理是否能將shared_ptr轉換成unique_ptr,面對這些問題,跟隨小編一起看看吧
    2022-08-08
  • C語言學生管理系統(tǒng)源碼分享

    C語言學生管理系統(tǒng)源碼分享

    這篇文章主要為大家分享了C語言學生管理系統(tǒng)的源碼,幫助大家學習結構體,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評論

台前县| 西丰县| 安阳市| 五大连池市| 马鞍山市| 乡城县| 南部县| 卢湾区| 怀安县| 宁安市| 阿坝| 曲麻莱县| 永善县| 尼勒克县| 高雄县| 桦南县| 长垣县| 富蕴县| 神农架林区| 青岛市| 盐城市| 青冈县| 沧州市| 精河县| 奈曼旗| 浑源县| 鄂托克前旗| 汝阳县| 耒阳市| 宁津县| 巩义市| 台北市| 衡东县| 应用必备| 正安县| 东平县| 丽水市| 云南省| 江源县| 衢州市| 赤壁市|