setjmp/longjmp の使用
setjmp と longjmp を一緒に使用すると、非ローカルの goto を実行することができます。 これらは通常、標準呼び出し規約や復帰規約を使用せずに、前に呼び出されたルーチンのエラー処理または回復コードに実行の制御を渡すために使用されます。
注意
ただし、setjmp と longjmp は C++ オブジェクトのセマンティクスをサポートせず、ローカル変数の最適化を妨げることによってパフォーマンスを低下させる可能性があるため、C++ プログラムでは使用しないことをお勧めします。代わりに、try/catch 構造を使用することをお勧めします。
C++ プログラムで setjmp/longjmp を使用することにした場合は、SETJMP.H または SETJMPEX.H もインクルードして、関数と C++ 例外処理との相互作用が正しく行われるようにします。 コンパイルで /EH を使用すると、スタック アンワインド中にローカル オブジェクトのデストラクターが呼び出されます。 コンパイルで /EHs を使用し、関数の 1 つが nothrow を使用する関数を呼び出して、nothrow を使用する関数が longjmp を呼び出すと、オプティマイザーによってはデストラクター アンワインドが実行されない場合があります。
移植性のあるコードで、longjmp を呼び出す非ローカルの goto が実行される場合、フレーム ベースのオブジェクトの適切な破棄が行われない可能性があります。