std::longjmp
来自cppreference.com
定义于头文件 <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
参阅
保存语境 (宏函数) |