函數呼叫慣例

來源:互聯網
上載者:User

標籤:使用   io   strong   for   ar   代碼   工作   sp   c++   

(轉)關於 C/C++ 函數呼叫慣例,大多數時候並不會影響程式邏輯,但遇到跨語言編程時,瞭解一下還是有好處的。

VC 中預設調用是 __cdecl 方式,Windows API 使用 __stdcall 調用方式,在 DLL 匯出函數中,為了跟Windows API 保持一致,建議使用 __stdcall 方式。

呼叫慣例跟堆棧清除密切相關。如果寫一個彙編函數,給 C/C++ 調用,在 __cdecl 方式下,則彙編函數無需清除堆棧,在 __stdcall 方式下,彙編函數需要在返回(RET)之前恢複堆棧。

C 語言有 __cdecl、__stdcall、__fastcall、naked、__pascal。

C++ 語言有 __cdecl、__stdcall、__fastcall、naked、__pascal、__thiscall,比 C 語言多出一種__thiscall 調用方式。

 

    在VC中,可以設定預設的呼叫慣例,設定路徑為:

Project->Properties ->Configuration Properties ->C/C++ ->Advanced -> Call Conversion。

 

下面詳細介紹如上六種調用方式:

1、__cdecl

__cdecl呼叫慣例又稱為 C 呼叫慣例,是 C/C++ 語言預設的呼叫慣例。參數按照從右至左的方式入棧,函數本身不清理棧,此工作由調用者負責,傳回值在EAX中。由於由調用者清理棧,所以允許可變參數函數存在,如int sprintf(char* buffer,const char* format,...);。

 

2、__stdcall

__stdcall 很多時候被稱為 pascal 呼叫慣例。pascal 語言是早期很常見的一種教學用電腦程式設計語言,其文法嚴謹。參數按照從右至左的方式入棧,函數自身清理堆棧,傳回值在EAX中。

 

3、__fastcall

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

 

4、naked

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

 

5、__pascal

這是 pascal 語言的呼叫慣例,跟 __stdcall 一樣,參數按照從右至左的方式入棧,函數自身清理堆棧,傳回值在EAX中。VC 中已經廢棄了這種調用方式,因此在寫 VC 程式時,建議使用 __stdcall 代替。

 

6、__thiscall

這是 C++ 語言特有的一種調用方式,用於類成員函數的呼叫慣例。如果參數確定,this 指標存放於 ECX 寄存器,函數自身清理堆棧;如果參數不確定,this指標在所有參數入棧後再入棧,調用者清理棧。__thiscall 不是關鍵字,程式員不能使用。參數按照從右至左的方式入棧。

函數呼叫慣例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.