[英]Does every function in a Windows GUI application need to use stdcall?
據我了解,調用者和被調用者都需要具有相同的調用約定。 否則,堆棧可能已損壞。
WinMain
用__stdcall
聲明並調用我定義的所有函數。 這是否意味着我定義的所有函數都應該使用stdcall
調用約定?
我試過不使用__stdcall
並且沒有發生任何不好的事情。 我還看到支持 Windows 的著名 GUI 庫不使用stdcall
。 為什么堆棧沒有損壞?
WinMain 用
__stdcall
聲明並調用我定義的所有函數。 這是否意味着我定義的所有函數都應該使用stdcall
調用約定?
不。調用約定是在每個函數調用的基礎上處理的,就在調用站點。 約定規定了調用者和被調用者如何管理調用堆棧——如何傳遞參數、以什么順序、誰清理堆棧等。只要調用者和被調用者同意對每個單獨的函數調用使用相同的調用約定, stdcall
函數調用使用不同約定的函數(如cdecl
是完全安全的,反之亦然。 函數的調用約定僅適用於:
除此之外,函數在內部所做的與它自己的調用約定無關。
例如,假設WinMain()
,一個stdcall
函數,想要調用一個cdecl
函數。
WinMain()
本身是一個stdcall
函數,這完全無關緊要。 雖然代碼執行在WinMain()
內部,但它可以為所欲為。 WinMain()
的stdcall
約定僅適用於WinMain()
本身的進入和退出。 這就是WinMain()
與 ITS 調用者的契約。
重要的是WinMain()
在為即將調用的cdecl
函數設置調用堆棧時必須遵循cdecl
的規則,並在該函數返回WinMain()
時清理調用堆棧。
這同樣適用於任何調用約定的任何函數調用。
我試過不使用
__stdcall
並且沒有發生任何不好的事情。 我還看到支持 Windows 的著名 GUI 庫不使用stdcall
。 為什么堆棧沒有損壞?
因為在每次函數調用和返回時都正確管理調用堆棧,所以沒有不平衡的清理來破壞堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.