setjmp と longjmp の使用

setjmplongjmp を一緒に使用すると、非ローカルの goto を実行することができます。 これらは通常、C コードで、標準呼び出し規則や復帰規則を使用せずに、前に呼び出されたルーチンのエラー処理または回復コードに実行の制御を渡すために使用されます。

注意事項

setjmplongjmp では、C++ コンパイラ間で移植可能なスタック フレーム オブジェクトの正常な破棄がサポートされていません。また、ローカル変数の最適化が妨げられてパフォーマンスが低下する可能性があるため、C++ プログラムでの使用はお勧めしません。 代わりに、trycatch の構造を使用することをお勧めします。

C++ プログラムで setjmplongjmp を使用することにした場合は、<setjmp.h> または <setjmpex.h> もインクルードして、関数と構造化例外処理 (SEH) または C++ 例外処理との間で相互作用が正しく行われるようにします。

Microsoft 固有の仕様

/EH オプションを使って C++ コードをコンパイルすると、スタック アンワインド中にローカル オブジェクトのデストラクターが呼び出されます。 ただし、/EHs または /EHsc を使ってコンパイルし、noexcept を使用する関数の 1 つが longjmp を呼び出す場合、オプティマイザーの状態によっては、その関数のデストラクター アンワインドが実行されない場合があります。

移植可能なコードで、longjmp 呼び出しが実行される場合、フレームベースのオブジェクトの正常な破棄は標準では明示的に保証されません。また、他のコンパイラではサポートされない場合があります。 念のため、警告レベル 4 では、setjmp を呼び出すと、次の警告 C4611 が発生します: "'_setjmp' と C++ オブジェクト デストラクション間での相互作用には互換性がありません。"

Microsoft 固有の仕様はここまで

関連項目

C (構造化) と C++ の混合例外