還原呼叫所 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 的範例。