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 によって返される値は、0 以外である必要があります。 0 として渡された場合 value 、値 1 は実際の戻り値で置換されます。

Microsoft 固有の仕様

Windows 上の Microsoft C++ コードでは、longjmp は、例外処理コードと同じスタック アンワインドセマンティックスを使用します。 C++ 例外を発生させるのと同じ場所で使用しても安全です。 ただし、この使用法は移植可能ではなく、いくつかの重要な注意事項があります。

呼び出された関数が返す前に呼び出longjmpsetjmpすだけです。それ以外の場合、結果は予測できません。

longjmp を使用する場合は、次の制限事項にご注意ください。

  • レジスタ変数の値が同じであると想定しないでくださいメイン。 setjmp を呼び出すルーチンのレジスタ変数の値は、longjmp の実行後、適切な値に復元されない場合があります。

  • 割り込みが浮動小数点例外によって発生しない限り、割り込み処理ルーチンから制御を転送するために使用 longjmp しないでください。 この場合、_fpreset を呼び出して浮動小数点演算パッケージが最初に再初期化されるなら、プログラムは longjmp を介して割り込みハンドラーから復帰できます。

  • Windows コードによって直接または間接的に呼び出されたコールバック ルーチンから制御を転送するために使用 longjmp しないでください。

  • /EHs または /EHsc を使用してコードがコンパイルされ、呼び出しを含むlongjmp関数がコンパイルされている場合、その関数内のローカル オブジェクトはnoexceptスタック アンワインド中に破棄されない可能性があります。

Microsoft 固有の仕様はここまで

Note

移植可能な C++ コードでは、setjmplongjmp で C++ オブジェクトのセマンティックスがサポートされることを前提にはできません。 具体的には、setjmplongjmpcatchthrow に置き換えることによって自動オブジェクトのための何らかの重要なデストラクターが呼び出される場合、setjmp/longjmp の呼び出しのペアには未定義の動作があります。 C++ プログラムでは、C++ の例外処理メカニズムを使用することをお勧めします。

詳細については、「setjmp/longjmp の使用」を参照してください。

必要条件

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

互換性の詳細については、「 Compatibility」を参照してください。

_fpreset の例を参照してください。

関連項目

プロセスと環境の制御setjmp