<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
C/C++函數有多種呼叫約定。
C語言:
C++比C語言多了一種:
__thiscall
__cdecl呼叫約定又稱為C呼叫約定,時C/C++語言預設的呼叫約定。引數按照從右向左的方式入棧,函數本身不清理棧,此工作由呼叫者負責,返回值在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; }
函數本身不清理棧,此工作由呼叫者負責
引數按照從右至左的方式入棧,函數自身清理堆疊,返回值在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; }
顧名思義,__fastcall 的特點就是快,因為它通過CPU暫存器來傳遞引數。他用ECX和EDX傳送前兩個雙字(DWORD)或更小的引數,剩下的引數按照從右至左的方式入棧,函數自身清理堆疊,返回值在EAX中。
naked是一個很少見的呼叫約定,一般不建議使用。編譯器不會給這種函數增加初始化和清理程式碼,更特殊的是你不能用return返回返回值,只能用插入組合返回結果,此呼叫約定必須跟_declspec同時使用。例如定義一個求和程式,如:_declspec (naked) int add(int a,int b) ;
這是pascal語言的呼叫約定,跟_stdcall一樣,引數按照從右至左的方式入棧,函數自身清理堆疊,返回值在EAX中。VS 中已經廢棄了這種呼叫方式,因此在寫VS程式時,建議使用_stdcall 代替。
這是C++語言特有的一種呼叫方式,用於類成員函數的呼叫約定。如果引數確定,this 指標存放於ECX 暫存器,函數自身清理堆疊;如果引數不確定,this 指標在所有引數入棧後再入棧,呼叫者清理棧。_thiscall 不是關鍵字,程式設計師不能使用。引數按照從右至左的方式入棧。
範例:
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; }
函數自身清理堆疊
物件地址放入暫存器 ECX中
1.修飾名
“C”或者“C++”函數在內部(編譯和連結)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字串。有些情況下使用函數的修飾名是必要的,如在模組定義檔案裡頭指定輸出“C++”過載函數、建構函式、解構函式,又如在組合程式碼裡呼叫“C””或“C++”函數等。
修飾名由函數名、類名、呼叫約定、返回型別、引數共同決定 。
2.名字修飾約定隨呼叫約定和編譯種類(C或C++)的不同而變化。
_stdcall呼叫約定在輸出函數名前加上一個下劃線字首,後面加上一個“@”符號和其引數的位元組數,格式:_functionname@number;如:_fun@4;
_cdecl呼叫約定僅在輸出函數名前加上一個下劃線字首,格式: _functionname。
_fastcall呼叫約定在輸出函數名前加上一個“@”符號,後面也是一個“@”符號和其引數的位元組數,格式: @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; }
__stdcall呼叫約定:
1.以"?""標識函數名的開始,後跟函數名;
2.函數名後面以"@@YG"標識參數列的開始,後跟參數列;
3.參數列以代號表示:
代號 | 型別 |
---|---|
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 | 指標 |
PA表示指標,後面的代號表明指標型別,如果相同型別的指標連續出現,以"o"代替,一個"O"代表一次重複;
4.參數列的第一項為該函數的返回值型別,其後依次為引數的資料型別,指標標識在其所指資料型別前;
5.參數列後以"@Z"標識整個名字的結束,如果該函數無引數,則以"Z"標識結束。
範例:
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; }
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45