Using setjmp and longjmp
When setjmp and longjmp are used together, they provide a way to execute a non-local goto. They are typically used in C code to pass execution control to error-handling or recovery code in a previously called routine without using the standard calling or return conventions.
longjmp don't support correct destruction of stack frame objects portably between C++ compilers, and because they might degrade performance by preventing optimization on local variables, we don't recommend their use in C++ programs. We recommend you use try and catch constructs instead.
If you decide to use
longjmp in a C++ program, also include <setjmp.h> or <setjmpex.h> to assure correct interaction between the functions and Structured Exception Handling (SEH) or C++ exception handling.
If you use an /EH option to compile C++ code, destructors for local objects are called during the stack unwind. However, if you use /EHs or /EHsc to compile, and one of your functions that uses noexcept calls
longjmp, then the destructor unwind for that function might not occur, depending on the optimizer state.
In portable code, when a
longjmp call is executed, correct destruction of frame-based objects is explicitly not guaranteed by the standard, and may not be supported by other compilers. To let you know, at warning level 4, a call to
setjmp causes warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable.
END Microsoft Specific