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 以外である必要があります。 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 の例を参照してください。