日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++,pascal函数调用约定

發布時間:2024/8/1 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++,pascal函数调用约定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C/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?不是關鍵字,程序員不能使用。參數按照從右至左的方式入棧。

總結

以上是生活随笔為你收集整理的C/C++,pascal函数调用约定的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。