std::longjmp

来自cppreference.com
< cpp‎ | utility‎ | program
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
 
定义于头文件 <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

参阅

保存语境
(宏函数)