使用 setjmp 和 longjmp
當 setjmp 和 longjmp 一起使用時 ,它們會提供執行非本機 goto
的方法。 它們通常會在 C 程式碼中使用,將執行控制項傳遞至先前呼叫的常式中的錯誤處理或復原程式碼,而不使用標準呼叫或傳回慣例。
警告
由於 setjmp
和 longjmp
不支援在 C++ 編譯器之間可移植地正確解構堆疊框架物件,而且由於它們可能會藉由防止本機變數優化而降低效能,因此不建議其在 C++ 程式中使用。 建議您改用 try
和 catch
建構。
如果您決定在 C++ 程式中使用 setjmp
和 longjmp
,也包含 < setjmp.h 或 < setjmpex.h >> ,以確保函式與結構化例外狀況處理 (SEH) 或 C++ 例外狀況處理之間的正確互動。
Microsoft 特定的
如果您使用 /EH 選項來編譯 C++ 程式碼,則會在堆疊回溯期間呼叫本機物件的解構函式。 不過,如果您使用 /EHs 或 /EHsc 進行編譯,並使用 noexcept 呼叫 longjmp
的 其中一個函式,則根據優化器狀態,該函式的解構函式回溯可能不會發生。
在可攜式程式碼中,執行呼叫時 longjmp
,明確不保證標準明確解構框架架構物件的解構,而且其他編譯器可能不支援。 若要讓您知道,在警告層級 4,呼叫 setjmp
會導致警告 C4611:'_setjmp' 與 C++ 物件解構之間的互動不可移植。
END Microsoft 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應