longjmp

恢复由 setjmp 调用设置的堆栈环境和执行区域设置。

语法

void longjmp(
   jmp_buf env,
   int value
);

参数

env
存储变量的环境。

value
要返回到 setjmp 调用的值。

注解

longjmp 函数还原之前由 env 保存在 setjmp 中的堆栈环境和执行区域设置。 setjmplongjmp 提供了一个执行非本地 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++ 代码中,不能假定 setjmplongjmp 支持 C++ 对象语义。 具体来说,如果用 catchthrow 替换 setjmplongjmp 将调用任何自动对象的非普通析构函数,则 setjmp/longjmp 调用对具有未定义的行为。 在 C++ 程序中,建议使用 C++ 异常处理机制。

有关详细信息,请参阅使用 setjmp 和 longjmp

要求

例程 必需的标头
longjmp <setjmp.h>

有关兼容性的详细信息,请参阅 兼容性

示例

请参阅 _fpreset 的示例。

另请参阅

进程和环境控制setjmp