longjmplongjmp

setjmp呼び出しによって設定されたスタック環境と実行ロケールを復元します。Restores the stack environment and execution locale set by a setjmp call.

構文Syntax

void longjmp(
   jmp_buf env,
   int value
);

パラメーターParameters

envenv
環境が格納されている変数。Variable in which environment is stored.

valuevalue
setjmp 呼び出しに返される値。Value to be returned to setjmp call.

RemarksRemarks

Longjmp関数は、前にでsetjmp envに保存したスタック環境と実行ロケールを復元します。The longjmp function restores a stack environment and execution locale previously saved in env by setjmp. setjmpおよびlongjmpは、非ローカルのgotoを実行する方法を提供します。通常は、通常の呼び出し規約と戻り値の規則を使用せずに、以前に呼び出されたルーチンのエラー処理または復旧コードに実行制御を渡すために使用されます。setjmp and longjmp provide a way to execute a nonlocal goto; they are typically used to pass execution control to error-handling or recovery code in a previously called routine without using the normal call and return conventions.

setjmp呼び出すと、現在のスタック環境がenvに保存されます。A call to setjmp causes the current stack environment to be saved in env. 次にlongjmpを呼び出すと、保存した環境が復元され、対応setjmpする呼び出しの直後のポイントに制御が戻ります。A subsequent call to longjmp restores the saved environment and returns control to the point immediately following the corresponding setjmp call. 実行は、valuesetjmp 呼び出しによって返されたかのように再開されます。Execution resumes as if value had just been returned by the setjmp call. コントロールを受け取るルーチンからアクセスできるすべての変数 (レジスタ変数を除く) の値には、 longjmpが呼び出されたときに取得した値が含まれます。The values of all variables (except register variables) that are accessible to the routine receiving control contain the values they had when longjmp was called. レジスタ変数の値は予測できません。The values of register variables are unpredictable. setjmp によって返される値は、0 以外である必要があります。The value returned by setjmp must be nonzero. value が 0 として渡される場合、実際の戻り値では 1 が代入されます。If value is passed as 0, the value 1 is substituted in the actual return.

Microsoft 固有の仕様Microsoft Specific

Windows 上C++の Microsoft コードでは、 longjmpは例外処理コードと同じスタックアンワインドセマンティクスを使用します。In Microsoft C++ code on Windows, longjmp uses the same stack-unwinding semantics as exception-handling code. 例外をC++発生させるのと同じ場所で安全に使用できます。It is safe to use in the same places that C++ exceptions can be raised. ただし、この使用方法はポータブルではなく、いくつかの重要な注意事項が付属しています。However, this usage is not portable, and comes with some important caveats.

setjmpを呼び出した関数の前にlongjmpを呼び出すだけです。それ以外の場合、結果は予測できません。Only call longjmp before the function that called setjmp returns; otherwise the results are unpredictable.

Longjmpを使用する場合は、次の制限事項に注意してください。Observe the following restrictions when using longjmp:

  • レジスタ変数の値は変わらないと見なさないでください。Do not assume that the values of the register variables will remain the same. を呼び出すsetjmp場合のレジスタ変数の値は、 longjmpの実行後に適切な値に復元されない可能性があります。The values of register variables in the routine calling setjmp may not be restored to the proper values after longjmp is executed.

  • 割り込みが浮動小数点例外によって引き起こされる場合を除き、割り込み処理ルーチンから制御を移すためにlongjmpを使用しないでください。Do not use longjmp to transfer control out of an interrupt-handling routine unless the interrupt is caused by a floating-point exception. この場合、プログラムは、 _fpresetを呼び出すことによって浮動小数点数値演算パッケージを最初に再初期化すると、 longjmpを使用して割り込みハンドラーから戻ることがあります。In this case, a program may return from an interrupt handler via longjmp if it first reinitializes the floating-point math package by calling _fpreset.

  • Windows コードによって直接または間接的に呼び出されたコールバックルーチンからコントロールを転送する場合は、 longjmpを使用しないでください。Do not use longjmp to transfer control from a callback routine invoked directly or indirectly by Windows code.

  • コードが /ehsまたは /ehscを使用してコンパイルされ、 longjmp呼び出しを含む関数がnoexceptの場合、その関数のローカルオブジェクトはスタックアンワインド中に破棄されされない可能性があります。If the code is compiled by using /EHs or /EHsc and the function that contains the longjmp call is noexcept then local objects in that function may not be destructed during the stack unwind.

Microsoft 固有の仕様はここまでEND Microsoft Specific

注意

C++移植可能なコードでは、 setjmpオブジェクトlongjmpのセマンティクスを想定してサポートC++することはできません。In portable C++ code, you can't assume setjmp and longjmp support C++ object semantics. 具体的にはsetjmp 、と/ longjmp setjmpを catch および throw で置き換えると、すべての自動オブジェクトに対して自明ではないデストラクターが呼び出される場合、呼び出しペアの動作は未定義になります。 longjmpSpecifically, a setjmp/longjmp call pair has undefined behavior if replacing the setjmp and longjmp by catch and throw would invoke any non-trivial destructors for any automatic objects. プログラムC++では、 C++例外処理機構を使用することをお勧めします。In C++ programs, we recommend you use the C++ exception-handling mechanism.

詳細については、「setjmp/longjmp の使用」を参照してください。For more information, see Using setjmp and longjmp.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
longjmplongjmp <setjmp.h ><setjmp.h>

互換性の詳細については、「 互換性」を参照してください。For additional compatibility information, see Compatibility.

Example

_fpreset」の例を参照してください。See the example for _fpreset.

関連項目See also

プロセス制御と環境制御Process and Environment Control
setjmpsetjmp