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
によって返される値は、0 以外である必要があります。 value
が 0 として渡された場合、値 1 は実際の戻り値で置換されます。
Microsoft 固有の仕様
Windows 上の Microsoft C++ コードでは、longjmp
は、例外処理コードと同じスタック アンワインドセマンティックスを使用します。 C++ 例外を発生させるのと同じ場所で使用しても安全です。 ただし、この使用法は移植可能ではなく、いくつかの重要な注意事項があります。
setjmp
呼び出した関数が戻る前にlongjmp
を呼び出すだけです。それ以外の場合、結果は予測できません。
longjmp
を使用する場合は、次の制限事項にご注意ください。
レジスタ変数の値が変わらないと想定しないでください。
setjmp
を呼び出すルーチンのレジスタ変数の値は、longjmp
の実行後、適切な値に復元されない場合があります。浮動小数点例外によって割り込みが発生しない限り、
longjmp
を使用して割り込み処理ルーチンから制御を転送しないでください。 この場合、_fpreset
を呼び出して浮動小数点演算パッケージが最初に再初期化されるなら、プログラムはlongjmp
を介して割り込みハンドラーから復帰できます。longjmp
を使用して、Windows コードによって直接または間接的に呼び出されたコールバック ルーチンから制御を転送しないでください。コードが /EHs または /EHscを使用してコンパイルされ、
longjmp
呼び出しを含む関数がnoexcept
されている場合、その関数内のローカル オブジェクトはスタック アンワインド中に破棄されない可能性があります。
Microsoft 固有の仕様はここまで
Note
移植可能な C++ コードでは、setjmp
と longjmp
で C++ オブジェクトのセマンティックスがサポートされることを前提にはできません。 具体的には、setjmp
と longjmp
を catch
と throw
に置き換えることによって自動オブジェクトのための何らかの重要なデストラクターが呼び出される場合、setjmp
/longjmp
の呼び出しのペアには未定義の動作があります。 C++ プログラムでは、C++ の例外処理メカニズムを使用することをお勧めします。
詳細については、「setjmp/longjmp の使用」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
longjmp |
<setjmp.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
_fpreset
の例を参照してください。