簡體   English   中英

__cdecl的使用,其職責是清理堆棧

[英]use of __cdecl and whose responsibility is to clean the stack

在了解__cdecl之后,我對堆棧清潔感到困惑。

請閱讀__cdecl將彈出堆棧參數( https://msdn.microsoft.com/zh-cn/library/zkwh89ks.aspx

那么我們是否需要在函數聲明中明確提及刪除堆棧參數,還是由編譯器負責生成適當的代碼以清理堆棧?

提前感謝

只要其他人( #include要使用您的庫的#include頭)正確聲明該函數,編譯器便會完成工作。 如果您未能為標頭提供適當的聲明,則他們需要使用適當的調用約定自行聲明該函數,否則它將使用碰巧適用於其項目的任何默認參數傳遞約定。

除非您正在編寫程序集,否則無需編寫任何內容即可清理堆棧。 編譯器將生成所需的代碼。

讀取__cdecl將彈出堆棧參數

您誤讀了鏈接到的文檔。 它的實際含義是:

調用函數從堆棧中彈出參數。

在cdecl中,只有調用者知道哪些參數已被壓入堆棧(這是支持可變參數的唯一方法),因此只有調用者知道如何正確清理堆棧。 只要您不編寫匯編代碼,並且將函數顯式聲明為__cdecl或項目的默認調用約定是__cdecl ,您就不必擔心這一點。 編譯器將生成正確的代碼。 就個人而言,如果您需要在多個項目中或與其他人共享此功能,我建議不要依賴默認項目設置。 最好明確聲明調用約定是安全的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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