longjmp
還原呼叫所 setjmp
設定的堆疊環境和執行地區設定。
語法
void longjmp(
jmp_buf env,
int value
);
參數
env
儲存環境的變數。
value
要傳回至 setjmp
呼叫的值。
備註
longjmp
函式會還原之前由 setjmp
儲存在 env
中的堆疊環境和執行地區設定。 setjmp
和 longjmp
提供執行非本機 goto
的方法;它們通常用來將執行控件傳遞至先前呼叫的例程中的錯誤處理或復原程序代碼,而不需使用一般呼叫和傳回慣例。
呼叫 setjmp
會在 env
中儲存目前的堆疊環境。 後續呼叫 longjmp
會還原儲存的環境,並將控制權還給緊接在對應 setjmp
呼叫之後的時間點。 執行會像呼叫傳setjmp
回一樣value
繼續執行。 接收控制項的常式可存取之所有變數 (暫存器變數除外) 的值會包含呼叫 longjmp
時所擁有的值。 無法預測暫存器變數的值。 setjmp
所傳回的值必須為非零。 如果 value
傳遞為 0,則會在實際傳回中取代值 1。
Microsoft 特定的
在 Windows 上的Microsoft C++程式代碼中, longjmp
使用與例外狀況處理程式代碼相同的堆疊回溯語意。 安全地在可以引發C++例外狀況的相同位置使用。 不過,此使用方式無法移植,並隨附一些重要的注意事項。
longjmp
只有在呼叫setjmp
的函式傳回之前呼叫,否則結果無法預測。
使用 longjmp
時,請注意下列限制:
請勿假設快取器變數的值會維持不變。 執行
longjmp
之後,可能無法將呼叫setjmp
之常式中的暫存器變數值還原為適當的值。除非中斷是由浮點例外狀況所造成,否則請勿使用
longjmp
將控制權移出中斷處理程式。 在此情況下,如果藉由呼叫_fpreset
先將浮點數學封裝重新初始化,則可能會透過longjmp
從中斷處理常式傳回一個程式。請勿使用
longjmp
從 Windows 程式代碼直接或間接叫用的回呼例程傳輸控制件。如果使用 /EHs 或 /EHsc 編譯程序代碼,且包含
longjmp
呼叫的函式為noexcept
,則該函式中的本機物件可能不會在堆疊回溯期間解構。
END Microsoft 特定的
注意
在可攜式C++程序代碼中,您無法假設 setjmp
並支援 longjmp
C++物件語意。 具體而言, setjmp
/longjmp
如果取代 setjmp
和 longjmp
catch
throw
,而且會針對任何自動物件叫用任何非簡單解構函式,則呼叫組具有未定義的行為。 在C++程式中,建議您使用C++例外狀況處理機制。
如需詳細資訊,請參閱使用 setjmp 和 longjmp。
需求
常式 | 必要的標頭 |
---|---|
longjmp |
<setjmp.h> |
如需相容性詳細資訊,請參閱相容性。
範例
請參閱 _fpreset
的範例。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: