当 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 调用 longjmp
,则该函数的析构函数展开可能不会发生,具体取决于优化器状态。
在可移植代码中,执行 longjmp
调用时,标准不明确保证正确销毁基于帧的对象,并且其他编译器对此可能也不支持。 你应了解一点,在警告级别 4,对 setjmp
的调用会导致出现警告 C4611:“_setjmp”和 C++ 对象销毁之间的交互是不可移植的。
结束 Microsoft 专用