CC++函數(shù)調(diào)用的方式有哪些_第1頁
CC++函數(shù)調(diào)用的方式有哪些_第2頁
CC++函數(shù)調(diào)用的方式有哪些_第3頁
CC++函數(shù)調(diào)用的方式有哪些_第4頁
CC++函數(shù)調(diào)用的方式有哪些_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、cc+函數(shù)調(diào)用的方式有哪些c/c+函數(shù)調(diào)用的方式有哪些棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),棧有一個(gè)存儲區(qū)、一個(gè)棧頂指針。 棧頂指針指向堆棧中第一個(gè)可用的數(shù)據(jù)項(xiàng)(被稱為棧頂)。用戶可以 在棧頂上方向棧中加入數(shù)據(jù),這個(gè)操作被稱為壓棧(push),壓棧以 后,棧頂自動變成新加入數(shù)據(jù)項(xiàng)的位置,棧頂指針也隨之修改。用 戶也可以從堆棧中取走棧頂,稱為彈出棧(pop),彈出棧后,棧頂下 的一個(gè)元素變成棧頂,棧頂指針隨之修改。函數(shù)調(diào)用時(shí),調(diào)用者依 次把參數(shù)壓棧,然后調(diào)用函數(shù),函數(shù)被調(diào)用以后,在堆棧中取得數(shù) 據(jù),并進(jìn)行計(jì)算。函數(shù)計(jì)算結(jié)束以后,或者調(diào)用者,或者函數(shù)本身 修改堆棧,使堆?;謴?fù)原裝。在參數(shù)傳遞中,有兩個(gè)重要的

2、問題必須要明確說明:1 .當(dāng)參數(shù)個(gè)數(shù)多于一個(gè)時(shí),按照什么順序把參數(shù)壓入堆棧;2 .函數(shù)調(diào)用后,由誰來把堆?;謴?fù)原狀。在高級語言中,就是通過函數(shù)的調(diào)用方式來說明這兩個(gè)問題的。 常見的調(diào)用方式有:stdcallcdeclfastcallthiscallthiscallnakedcall下面就分別介紹這幾種調(diào)用方式:1.stdcallstdcall調(diào)用方式又被稱為pascal調(diào)用方式。在microsoftc+ 系列的c/c+編譯器中,使用pascal宏,winapi宏和callback宏 來指定函數(shù)的調(diào)用方式為stdcallostdcall調(diào)用方式的, 函數(shù)聲明為:int_stdcallfuncti

3、on(inta, intb);stdcall的調(diào)用方式意味著:(1)參數(shù)從右向左一次壓入堆棧(2)由被調(diào)用函數(shù)自己來恢復(fù)堆棧(3)函數(shù)名自動加前導(dǎo)下劃線,后面緊跟著一個(gè),其后緊跟著參 數(shù)的尺寸上而那個(gè)函數(shù)翻譯成匯編語言將變成:pushb先壓入第二個(gè)參數(shù)pusha再壓入第一個(gè)參數(shù)callfunction調(diào)用函數(shù)在編譯時(shí),此函數(shù)的名字被翻譯為_function82. cdeclintfunction(inta, intb)不加修飾符就是c調(diào)用方式int_cdeclfunction(inta, intb)明確指定用 c 調(diào)用方式cdecl的調(diào)用方式?jīng)Q定了:(1)參數(shù)從右向左依次壓入堆棧(2)由調(diào)用者

4、恢復(fù)堆棧(3)函數(shù)名自動加前導(dǎo)下劃線由于是由調(diào)用者來恢復(fù)堆棧,因此c調(diào)用方式允許函數(shù)的參數(shù)個(gè) 數(shù)是不固定的,這是c語言的一大特色。此方式的函數(shù)被翻譯為:pushb 先壓入第二個(gè)參數(shù)pusha 在壓入第一個(gè)參數(shù)callfuntion 調(diào)用函數(shù)addesp, 8清理堆棧在編譯時(shí),此方式的函數(shù)被翻譯成:function3. fastcallfastcall按照名字上理解就可以知道,它是一種快速調(diào)用方式。 此方式的函數(shù)的第一個(gè)和第二個(gè)dword參數(shù)通過ecx和edx傳遞,后而的參數(shù)從右向左的順序壓入棧。被調(diào)用函數(shù)清理堆棧。函數(shù)名修個(gè)規(guī)則同stdcall其聲明語法為:intfastcallfunctio

5、n(inta, intb);4. thiscallthiscall調(diào)用方式是唯一一種不能顯示指定的修飾符。它是c+ 類成員函數(shù)缺省的調(diào)用方式。由于成員函數(shù)調(diào)用還有一個(gè)this指針, 因此必須用這種特殊的調(diào)用方式。thiscall調(diào)用方式意味著:參數(shù)從右向左壓入棧。如果參數(shù)個(gè)數(shù)確定,this指針通過ecx傳遞給被調(diào)用者;如果參 數(shù)個(gè)數(shù)不確定,this指針在所有參數(shù)壓入棧后被壓入棧。參數(shù)個(gè)數(shù)不定的,由調(diào)用者清理堆棧,否則由函數(shù)自己清理堆棧??梢钥吹剑瑢τ趨?shù)個(gè)數(shù)固定的情況,它類似于stdcall,不定 時(shí)則類似于cdecl。5. nakedcall是一種比較少見的調(diào)用方式,一般高級程序設(shè)計(jì)語言中不

6、常見。函數(shù)的聲明調(diào)用方式和實(shí)際調(diào)用方式必須一致,必然編譯器會產(chǎn) 生混亂。函數(shù)名字修改規(guī)則:1. c編譯時(shí)函數(shù)名修飾約定規(guī)則:_stdcall調(diào)用約定在輸出函數(shù)名前加上一個(gè)下劃線前綴,后面 加上一個(gè)“”符號和其參數(shù)的字節(jié)數(shù),格式為_function8。_cdecl調(diào)用約定僅在輸出函數(shù)名前加上一個(gè)下劃線前綴,格式 為function。_fastcall調(diào)用約定在輸出函數(shù)名前加上一個(gè)“十 符號,后面 也是一個(gè)符號和其參數(shù)的字節(jié)數(shù),格式為function8。它們均不改變輸出函數(shù)名中的字符大小寫,這和pascal調(diào)用約 定不同,pascal約定輸出的函數(shù)名無任何修飾且全部大寫。2. c+編譯時(shí)函數(shù)名修飾

7、約定規(guī)則:stdcall調(diào)用約定:(1)以“?”標(biāo)識函數(shù)名的開始,后跟函數(shù)名;(2)函數(shù)名后面以“yg”標(biāo)識參數(shù)表的開始,后跟參數(shù)表;(3)參數(shù)表以代號表示:x-void,dchar,e-unsignedchar,f-short,hint,i-unsignedintj-long,k-unsignedlong,m一float,n-double,_n-bool.pa一表示指針,后面的代號表明指針類型,如果相同類型的指針 連續(xù)出現(xiàn),以“0”代替,一個(gè)“0”代表一次重復(fù);(4)參數(shù)表的第一項(xiàng)為該函數(shù)的返回值類型,其后依次為參數(shù)的 數(shù)據(jù)類型,指針標(biāo)識在其所指數(shù)據(jù)類型前;(5)參數(shù)表后以“z”標(biāo)識整個(gè)名字的結(jié)束,如果該函數(shù)無參數(shù), 則以“z”標(biāo)識結(jié)束。inttestl(charivari, unsignedlong)?testlyghpadkz”voidtest2() “?test2ygxxz”cdecl調(diào)用約定:規(guī)則同上面的_stdcall調(diào)用約

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論