std::longjmp

来自cppreference.com
< cpp‎ | utility‎ | program
定义于头文件 <csetjmp>
             void longjmp( std::jmp_buf env, int status );
(C++17 前)
[[noreturn]] void longjmp( std::jmp_buf env, int status );
(C++17 起)

加载先前的 setjmp 调用所保存的执行环境 env 。此函数不返回。控制被转移到设置了 env 的宏 setjmp 的调用点。该 setjmp 随后返回作为 status 传递的值。

若调用了 setjmp 的函数已退出,则行为未定义(换言之,仅允许在调用栈向上长跳)

不调用任何自动对象的析构函数。若以 throw 替换 std::longjmp 且以 catch 替换 setjmp 会执行任何自动对象的非平凡析构函数,则这种 std::longjmp 的行为未定义。

目录

[编辑] 参数

env - 指代 setjmp 所保存的函数执行状态的变量
status - setjmp 返回的值。若它等于 0 ,则以用 1 代替

[编辑] 返回值

(无)

[编辑] 注意

longjmp 是 C 中处理函数无法有意义返回处的错误条件的机制。 C++ 通常为此目的使用异常处理

[编辑] 示例

#include <iostream>
#include <csetjmp>
 
std::jmp_buf jump_buffer;
 
[[noreturn]] void a(int count) 
{
    std::cout << "a(" << count << ") called\n";
    std::longjmp(jump_buffer, count+1);  // setjump() 将返回 count+1
}
 
int main()
{
    volatile int count = 0; // 必须为 setjmp 设定局部变量为 volatile
    if (setjmp(jump_buffer) != 9) {
        a(count++);  // This will cause setjmp() to exit
    }
}

输出:

a(0) called
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called

[编辑] 参阅

保存环境
(宏函数) [编辑]
longjmpC 文档