簡體   English   中英

Windows GUI 應用程序中的每個函數都需要使用 stdcall 嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM