[問題] __stdcall 和 __cdecl的問題

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間14年前 (2012/04/23 13:58), 編輯推噓1(1010)
留言11則, 3人參與, 最新討論串1/2 (看更多)
大家好 刻意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

04/23 15:29, , 1F
當你要宣告一個 function pointer 時就要明確指定
04/23 15:29, 1F

04/23 15:30, , 2F
e.g.: void (__stdcall *f)(int)=GetProcAddress(...)
04/23 15:30, 2F

04/23 16:44, , 3F
你不是有看程式設計師的自我修養,上面第十章比這網頁
04/23 16:44, 3F

04/23 16:45, , 4F
寫得更詳細、完整,光看片面的資訊不太有用
04/23 16:45, 4F

04/24 22:36, , 5F
請問1F 我之前並沒有特別加上__stdcall 也 可以成功呼叫
04/24 22:36, 5F

04/24 22:38, , 6F
我不加的話預設是_cdecl吧? win32 API應該都是__stdcall吧
04/24 22:38, 6F

04/24 22:38, , 7F
為啥我沒遇到問題呢?
04/24 22:38, 7F

04/24 23:51, , 8F
我沒加是直接當掉 ...
04/24 23:51, 8F

04/25 00:10, , 9F
請問是load win32 API 某dll裡面的API嗎?
04/25 00:10, 9F

04/25 00:11, , 10F
我確實沒加 因為之前根本不懂這個orz~但可以work..
04/25 00:11, 10F

04/25 02:36, , 11F
之前是 load dwmapi.dll
04/25 02:36, 11F
文章代碼(AID): #1FbEzoMU (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FbEzoMU (C_and_CPP)