longjmp

還原呼叫所 setjmp 設定的堆疊環境和執行地區設定。

語法

void longjmp(
   jmp_buf env,
   int value
);

參數

env
儲存環境的變數。

value
要傳回至 setjmp 呼叫的值。

備註

longjmp 函式會還原之前由 setjmp 儲存在 env 中的堆疊環境和執行地區設定。 setjmplongjmp 提供執行非本機 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 如果取代 setjmplongjmpcatchthrow ,而且會針對任何自動物件叫用任何非簡單解構函式,則呼叫組具有未定義的行為。 在 C++ 程式中,建議您使用 C++ 例外狀況處理機制。

如需詳細資訊,請參閱使用 setjmp 和 longjmp

需求

常式 必要的標頭
longjmp <setjmp.h>

如需相容性詳細資訊,請參閱相容性

範例

請參閱 的 _fpreset 範例。

另請參閱

進程和環境控制setjmp