命名空间
变体
操作

std::longjmp

来自 cppreference.com
< cpp‎ | utility‎ | program
 
 
实用工具库
语言支持
类型支持 (基本类型, RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用工具
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(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 的函数已退出,则行为未定义(换句话说,只允许向上调用堆栈的长时间跳转)。

内容

[编辑] C++ 中的额外限制

除了 C longjmp 外,C++ std::longjmp 的行为更加严格。

如果用 throw 替换 std::longjmp,用 setjmp 替换 catch 会为任何自动对象调用 非平凡析构函数,则此类 std::longjmp 的行为未定义。

如果在 协程 中调用 std::longjmp,而在 co_await 运算符可能被使用的地方,则行为未定义。

(自 C++20 起)

[编辑] 参数

env - 引用由 setjmp 保存的程序执行状态的变量
status - 要从 setjmp 返回的值。如果它等于 0,则使用 1 代替

[编辑] 返回值

(无)

[编辑] 注释

std::longjmp 是 C 中用于处理无法以有意义的方式返回的意外错误条件的机制。C++ 通常使用 异常处理 来实现此目的。

[编辑] 示例

#include <array>
#include <cmath>
#include <csetjmp>
#include <cstdlib>
#include <format>
#include <iostream>
 
std::jmp_buf solver_error_handler;
 
std::array<double, 2> solve_quadratic_equation(double a, double b, double c)
{
    const double discriminant = b * b - 4.0 * a * c;
    if (discriminant < 0)
        std::longjmp(solver_error_handler, true); // Go to error handler
 
    const double delta = std::sqrt(discriminant) / (2.0 * a);
    const double argmin = -b / (2.0 * a);
    return {argmin - delta, argmin + delta};
}
 
void show_quadratic_equation_solution(double a, double b, double c)
{
    std::cout << std::format("Solving {}x² + {}x + {} = 0...\n", a, b, c);
    auto [x_0, x_1] = solve_quadratic_equation(a, b, c);
    std::cout << std::format("x₁ = {}, x₂ = {}\n\n", x_0, x_1);
}
 
int main()
{
    if (setjmp(solver_error_handler))
    {
        // Error handler for solver
        std::cout << "No real solution\n";
        return EXIT_FAILURE;
    }
 
    for (auto [a, b, c] : {std::array{1, -3, 2}, {2, -3, -2}, {1, 2, 3}})
        show_quadratic_equation_solution(a, b, c);
 
    return EXIT_SUCCESS;
}

输出

Solving 1x² + -3x + 2 = 0...
x₁ = 1, x₂ = 2
 
Solving 2x² + -3x + -2 = 0...
x₁ = -0.5, x₂ = 2
 
Solving 1x² + 2x + 3 = 0...
No real solution

[编辑] 缺陷报告

以下更改行为的缺陷报告被追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确的行为
LWG 619 C++98 C++ 中额外限制的措辞含糊不清 改进了措辞
LWG 894 C++98 如果用 throw 替换
std::longjmp,用
catch 替换
std::longjmp,会销毁任何自动对象,则行为未定义
只有在
调用任何自动对象的非平凡析构函数时,行为才未定义

[编辑] 另请参阅

保存上下文
(函数宏) [编辑]
C 文档longjmp