setjmp と longjmp の使用
setjmp と longjmp を一緒に使用すると、非ローカルの goto
を実行することができます。 これらは通常、C コードで、標準呼び出し規則や復帰規則を使用せずに、前に呼び出されたルーチンのエラー処理または回復コードに実行の制御を渡すために使用されます。
注意事項
setjmp
と longjmp
では、C++ コンパイラ間で移植可能なスタック フレーム オブジェクトの正常な破棄がサポートされていません。また、ローカル変数の最適化が妨げられてパフォーマンスが低下する可能性があるため、C++ プログラムでの使用はお勧めしません。 代わりに、try
と catch
の構造を使用することをお勧めします。
C++ プログラムで setjmp
と longjmp
を使用することにした場合は、<setjmp.h> または <setjmpex.h> もインクルードして、関数と構造化例外処理 (SEH) または C++ 例外処理との間で相互作用が正しく行われるようにします。
Microsoft 固有の仕様
/EH オプションを使って C++ コードをコンパイルすると、スタック アンワインド中にローカル オブジェクトのデストラクターが呼び出されます。 ただし、/EHs または /EHsc を使ってコンパイルし、noexcept を使用する関数の 1 つが longjmp
を呼び出す場合、オプティマイザーの状態によっては、その関数のデストラクター アンワインドが実行されない場合があります。
移植可能なコードで、longjmp
呼び出しが実行される場合、フレームベースのオブジェクトの正常な破棄は標準では明示的に保証されません。また、他のコンパイラではサポートされない場合があります。 念のため、警告レベル 4 では、setjmp
を呼び出すと、次の警告 C4611 が発生します: "'_setjmp' と C++ オブジェクト デストラクション間での相互作用には互換性がありません。"
Microsoft 固有の仕様はここまで
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示