看板 C_and_CPP 關於我們 聯絡資訊
大家好 刻意google這兩者的差別 都有做簡短的介紹 除了name mangling會不一樣 好像是處理堆疊的方式會因為這兩個 "修飾字" 而不一樣 但這網頁特別有說一句話 http://www.wretch.cc/blog/zevoid/216921 "不論透過動態或靜態連結至第三方的函式庫,一定要弄清楚呼叫協定為何,不然執行時 期會發生堆疊被打亂的嚴重情形。" 乍聽之下好像有道理 但我想一想 假如我做一個dll declaration 在.h 有冠上__stdcall 對方引用我的dll 若他是implicit 方式 , 勢必需要我的.h檔案 那這樣為啥還會有她說的那句話問題產生? 我想到唯一可能的方式 是...他刻意修改我的.h檔案 把__stdcall拿掉 改成__cdecl 但這樣 name mangling後...應該會變成unresolved external symbol... 所以我想不到他這句話會有甚麼情況會產生這問題? 若是explicit link... 我用GetProcAddress 也不用 (更是不知道) 對方到底是__stdcall還是__cdecl... 這樣會出問題嗎? 這邊也不是很明白 提出來請教各位 謝謝 ps. 我故意在VC打 void __stdcall Foo(); 下一行打 void __cdecl Foo(); 他會寫說我redefine了.. 這是VC compiler刻意擋掉嗎? 照理講不是Decorate後 會不一樣 怎會產生這compile error@@? 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.147.15.66
legnaleurc:當你要宣告一個 function pointer 時就要明確指定 04/23 15:29
legnaleurc:e.g.: void (__stdcall *f)(int)=GetProcAddress(...) 04/23 15:30
purpose:你不是有看程式設計師的自我修養,上面第十章比這網頁 04/23 16:44
purpose:寫得更詳細、完整,光看片面的資訊不太有用 04/23 16:45
QQ29:請問1F 我之前並沒有特別加上__stdcall 也 可以成功呼叫 04/24 22:36
QQ29:我不加的話預設是_cdecl吧? win32 API應該都是__stdcall吧 04/24 22:38
QQ29:為啥我沒遇到問題呢? 04/24 22:38
legnaleurc:我沒加是直接當掉 ... 04/24 23:51
QQ29:請問是load win32 API 某dll裡面的API嗎? 04/25 00:10
QQ29:我確實沒加 因為之前根本不懂這個orz~但可以work.. 04/25 00:11
legnaleurc:之前是 load dwmapi.dll 04/25 02:36