# std::longjmp

< 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

### 参阅

setjmp | 保存语境 (宏函数)