国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

函數調用規范__cdecl和__stdcall的區別一目了然(表格形式)

2019-11-08 03:01:46
字體:
來源:轉載
供稿:網友
 函數調用規范__cdecl和__stdcall的區別一目了然(表格形式)原作:葡萄架上的牽牛花原地址:http://blog.bcchinese.net/happyjet/archive/2005/05/24/22545.asp
 __cdecl  __stdcall
 C和C++程序的缺省調用規范 為了使用這種調用規范,需要你明確的加上__stdcall(或WINAPI)文字。即return-type__stdcallfunction-name[(argument-list)] 
 在調用函數(Callee)返回,由調用方(Caller)調整堆棧。 1. 調用方的函數調用                                         2. 被調用函數的執行 3. 被調用函數的結果返回 4. 調用方清除調整堆棧                                                                 在調用函數(Callee)返回,由調用函數(Callee)調整堆棧。圖示: 1. 調用方的函數調用 2. 被調用函數的執行 3. 被調用函數清除調整堆棧 4. 被調用函數的結果返回                                                          
 因為每個調用的地方都需要生成一段調整堆棧的代碼,所以最后生成的文件較大。  因為調整堆棧的代碼只存在在一個地方(被調用函數的代碼內),所以最后生成的文件較小。
 函數的參數個數可變(就像PRintf函數一樣),因為只有調用者才知道它傳給被調用函數幾個參數,才能在調用結束時適當地調整堆棧。  函數的參數個數不能是可變的。
 對于定義在C程序文件中的輸出函數,函數名會保持原樣,不會被修飾。對于定義在C++程序文件中的輸出函數,函數名會被修飾,MSDN說Underscore character (_) is prefixed to names.我實際測試(VC4和VC6)下來發現好像不是那么簡單。可通過在前面加上extern“C”以去除函數名修飾。也可通過.def文件去除函數名修飾。 不論是C程序文件中的輸出函數還是C++程序文件中的輸出函數,函數名都會被修飾。對于定義在C程序文件中的輸出函數,An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list.對于定義在C++程序文件中的輸出函數,好像更復雜,和__cdecl的情況類似。好像只能通過.def文件去除函數名修飾。 
 _beginthread需要__cdecl的線程函數地址  _beginthreadex和CreateThread需要__stdcall的線程函數地址 
 兩者的參數傳遞順序都是從右向左。為了讓VB可以調用,需要用__stdcall調用規范來定義C/C++函數。請參看Microsoft KB153586 文章:How To Call C Functions That Use the _cdecl Calling Convention。當你LoadLibrary一個DLL文件后, 把GetProcAddress取得的函數地址傳給上面三個線程生成函數時,請務必確認實際定義在DLL文件的輸出函數符合調用規范要求。否則,編譯成Release版后運行,可能會破壞堆棧,程序行為不可預測。VC中的相關編譯開關:/Gd /Gr /Gz。另外,VC6中新增加的 /GZ 編譯開關可以幫你檢查堆棧問題。我也是初學者,若有不對的地方、可以補充的地方,請指教。謝謝。 
 (補充)匯編語言視點的比較文章:Intel x86 Function-call Conventions - Assembly View  
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安仁县| 锡林浩特市| 静宁县| 博客| 苗栗县| 山东省| 龙井市| 封开县| 察雅县| 新巴尔虎左旗| 莎车县| 开封县| 奉新县| 五原县| 阳原县| 石嘴山市| 天津市| 永仁县| 枣庄市| 海原县| 阿尔山市| 石渠县| 原平市| 山东| 土默特左旗| 鹤岗市| 肥城市| 长春市| 平舆县| 冷水江市| 蚌埠市| 常山县| 瑞昌市| 宁海县| 鹿泉市| 嘉义市| 台州市| 明溪县| 株洲县| 城固县| 香河县|