longjmp
恢复由 setjmp
调用设置的堆栈环境和执行区域设置。
语法
void longjmp(
jmp_buf env,
int value
);
参数
env
存储变量的环境。
value
要返回到 setjmp
调用的值。
注解
longjmp
函数还原之前由 env
保存在 setjmp
中的堆栈环境和执行区域设置。 setjmp
和 longjmp
提供了一个执行非本地 goto
的方法,它们通常用于将执行控制传递给之前调用的例程中的错误处理或恢复代码而不使用正常调用,然后返回约定。
对 setjmp
的调用将导致当前堆栈环境保存在 env
中。 对 longjmp
的后续调用将还原保存的环境并将控件返回到紧跟在对应的 setjmp
调用后面的点。 执行会像 setjmp
调用返回了 value
一样继续。 可供接收控件的例程访问的所有变量(寄存器变量除外)的值包含在调用 longjmp
时它们具有的值。 寄存器变量的值是不可预知的。 setjmp
返回的值必须为非零。 如果将 value
作为 0 传递,则会在实际的返回中将值 1 替换。
Microsoft 专用
在 Windows 上的 Microsoft C++ 代码中,longjmp
使用与异常处理代码相同的堆栈展开语义。 可以安全地在会引发 C++ 异常的相同位置中使用。 但是,此用法不可移植,并且有一些重要的注意事项。
仅在调用 setjmp
的函数返回前调用 longjmp
,否则结果是不可预知的。
在使用 longjmp
时,请注意以下限制:
不要假定寄存器变量的值保持不变。 执行
setjmp
后,调用longjmp
的例程中的寄存器变量的值不能恢复为正确值。除非中断是由浮点异常引起的,否则不要使用
longjmp
将控制转移出中断处理例程。 在这种情况下,程序可能通过longjmp
从中断处理程序返回,前提是它首先通过调用_fpreset
重新初始化浮点数学包。不要使用
longjmp
从 Windows 代码直接或间接调用的回叫例程传输控制。如果使用 /EHs 或 /EHsc 编译代码,并且包含
longjmp
调用的函数是noexcept
,那么在堆栈展开期间,可能无法析构该函数中的本地对象。
结束 Microsoft 专用
注意
在可移植的 C++ 代码中,不能假定 setjmp
和 longjmp
支持 C++ 对象语义。 具体来说,如果用 catch
和 throw
替换 setjmp
和 longjmp
将调用任何自动对象的非普通析构函数,则 setjmp
/longjmp
调用对具有未定义的行为。 在 C++ 程序中,建议使用 C++ 异常处理机制。
有关详细信息,请参阅使用 setjmp 和 longjmp。
要求
例程 | 必需的标头 |
---|---|
longjmp |
<setjmp.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例
请参阅 _fpreset
的示例。