longjmp

还原由调用设置的堆栈环境和执行区域设置 setjmp

语法

void longjmp(
   jmp_buf env,
   int value
);

参数

Env
存储变量的环境。

value
要返回到 setjmp 调用的值。

备注

longjmp 函数还原以前保存在 env 中的堆栈环境和执行区域设置setjmpsetjmp和 longjmpgoto提供了一种执行非本地的方法;它们通常用于将执行控制传递给以前调用的例程中的错误处理或恢复代码,而无需使用常规调用和返回约定。

对 的 setjmp 调用会导致当前堆栈环境保存在 env 中。 对 longjmp 的后续调用 将还原保存的环境,并返回对相应调用之后紧接的点 setjmp 的控制。 执行将继续,就好像刚刚通过 setjmp 调用返回 value 一样。 除寄存器变量 (接收) 的寄存器变量之外,所有变量的值都包含调用 longjmp 时的值。 寄存器变量的值是不可预知的。 setjmp 返回的值必须为非零。 如果将 value 作为 0 传递,在实际返回中将替换值 1。

Microsoft 专用

在 Windows 上的 Microsoft C++ 代码中,longjmp 使用与异常处理代码相同的堆栈展开语义。 在可以引发 C++ 异常的同一位置使用是安全的。 但是,这种用法不可移植,并附带一些重要注意事项。

仅在调用 的函数返回setjmp之前调用 longjmp;否则结果不可预测。

使用 longjmp 时,请注意以下限制:

  • 不要假定寄存器变量的值保持不变。 执行 longjmpsetjmp,例程调用中的 register 变量的值可能无法还原到正确的值。

  • 除非中断是由浮点异常引起的,否则请勿使用 longjmp 将控制从中断处理例程中转移出来。 在这种情况下,如果程序首先通过调用 longjmp 重新初始化浮点数学包,则该程序可能会通过 longjmp 从中断处理程序_fpreset

  • 请勿使用 longjmp 从由代码直接或间接调用的回调例程Windows控制。

  • 如果代码是使用 /EHs/EHsc 编译的,并且包含 longjmpnoexcept 调用的函数是该函数中的本地对象,则堆栈展开期间可能不会破坏该函数中的本地对象。

结束 Microsoft 专用

注意

在可移植 C++ 代码中,不能假定setjmplongjmp并支持 C++ 对象语义。 具体而言,如果setjmp/longjmpcatchsetjmplongjmpthrow 和 替换为 ,则调用对具有未定义的行为,并且会调用任何自动对象的任何非普通析构函数。 在 C++ 程序中,建议使用 C++ 异常处理机制。

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

要求

例程所返回的值 必需的标头
longjmp <setjmp.h>

有关其他兼容性信息,请参阅兼容性

示例

请参阅 _fpreset 的示例。

请参阅

进程和环境控制
setjmp