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 以外である必要があります。 0 として渡された場合 value
、値 1 は実際の戻り値で置換されます。
Microsoft 固有の仕様
Windows 上の Microsoft C++ コードでは、longjmp
は、例外処理コードと同じスタック アンワインドセマンティックスを使用します。 C++ 例外を発生させるのと同じ場所で使用しても安全です。 ただし、この使用法は移植可能ではなく、いくつかの重要な注意事項があります。
呼び出された関数が返す前に呼び出longjmp
setjmp
すだけです。それ以外の場合、結果は予測できません。
longjmp
を使用する場合は、次の制限事項にご注意ください。
レジスタ変数の値が同じであると想定しないでくださいメイン。
setjmp
を呼び出すルーチンのレジスタ変数の値は、longjmp
の実行後、適切な値に復元されない場合があります。割り込みが浮動小数点例外によって発生しない限り、割り込み処理ルーチンから制御を転送するために使用
longjmp
しないでください。 この場合、_fpreset
を呼び出して浮動小数点演算パッケージが最初に再初期化されるなら、プログラムはlongjmp
を介して割り込みハンドラーから復帰できます。Windows コードによって直接または間接的に呼び出されたコールバック ルーチンから制御を転送するために使用
longjmp
しないでください。/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
の例を参照してください。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示