setjmp
プログラムの現在の状態を保存します。
構文
int setjmp(
jmp_buf env
);
パラメーター
env
環境が格納されている変数。
戻り値
スタックの環境を保存した後に 0 を返します。 longjmp
呼び出しのためにsetjmp
戻った場合は、longjmp
のvalue
引数を返します。または、longjmp
のvalue
引数が 0 の場合、setjmp
は 1 を返します。 エラーの戻り値はありません。
解説
setjmp
関数はスタックの環境を保存します。この環境は、longjmp
を使用して後から復元することができます。 setjmp
と longjmp
を一緒に使用すると、非ローカルの goto
を実行する方法が提供されます。 これらは一般に、通常の呼び出し規則や復帰規則を使用せずに、以前に呼び出されたルーチン内のエラー処理コードまたは回復用コードに実行制御を渡すために使用されます。
setjmp
の呼び出しにより、現在のスタックの環境が env
で保存されます。 longjmp
への後続の呼び出しは、保存されている環境を復元し、対応する setjmp
呼び出しの直後のポイントにコントロールを返します。 コントロールを受け取るルーチンにアクセスできるすべての変数 (レジスタ変数を除く) には、longjmp
が呼び出されたときに保持していた値が含まれます。
setjmp
を使用して、ネイティブ コードからマネージド コードにジャンプすることはできません。
Microsoft 固有の仕様
Windows 上の Microsoft C++ コードでは、longjmp
は、例外処理コードと同じスタック アンワインドセマンティックスを使用します。 これは、C++ の例外が発生する可能性があるのと同じ場所で使用する方が安全です。 ただし、この使用法は移植可能ではなく、いくつかの重要な注意事項があります。 詳細については、「longjmp
」を参照してください。
Microsoft 固有の仕様はここまで
Note
移植可能な C++ コードでは、setjmp
と longjmp
で C++ オブジェクトのセマンティックスがサポートされることを前提にはできません。 具体的には、setjmp
と longjmp
を catch
と throw
に置き換えることによって自動オブジェクトのための何らかの重要なデストラクターが呼び出される場合、setjmp
/longjmp
の呼び出しのペアには未定義の動作があります。 C++ プログラムでは、C++ の例外処理メカニズムを使用することをお勧めします。
詳細については、「setjmp
と longjmp
の使用」を参照してください。
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
setjmp |
<setjmp.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
_fpreset
の例を参照してください。