国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > longjmp 以获得更好的体验。

# C 语言标准库函数 longjmp

在头文件 setjmp.h 中定义。
/*********************************************
 * @brief 远程跳转
 * @param env 要跳转到的上下文
 * @param status 作为 setjmp 的返回值
 ********************************************/
void longjmp(jup_buf env, int status);

!subtitle:说明

加载此前 setjmp 保存的执行上下文 env,执行流程转移到 setjmp 调用处,返回 status

如果调用 setjmp 的函数已经退出(函数返回或通过其它 longjmp 跳出),则 longjmp 是未定义行为。也就是说,只允许沿调用栈向上进行长跳转。

!subtitle:参数

  • env - 要跳转的执行上下文

  • status - 作为 setjmp 的返回值

!subtitle:返回值

无(此函数不会返回)

# 示例

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
 
// 保存上下文的变量
jmp_buf env;
 
void func(int status) 
{
    printf("调用 func(%d)\n", status);
    longjmp(env, status); // 跳转,setjmp 返回 status
}
 
int main(void)
{
    volatile int count = 0; // 这个变量在 setjmp 之后会被修改,因此声明为 volatile

    if (setjmp(env) < 5)    // 保存上下文,检查返回值
        func(count++);      // 修改了 count 的值

    return 0;
}

运行结果:

调用 func(0)
调用 func(1)
调用 func(2)
调用 func(3)
调用 func(4)
调用 func(5)

# 推荐阅读

# 外部参考

# 参考标准

  • C17 standard (ISO/IEC 9899:2018):

    • 7.13.2.1 The longjmp macro (p: 191-192)

  • C11 standard (ISO/IEC 9899:2011):

    • 7.13.2.1 The longjmp macro (p: 263-264)

  • C99 standard (ISO/IEC 9899:1999):

    • 7.13.2.1 The longjmp macro (p: 244-245)

  • C89/C90 standard (ISO/IEC 9899:1990):

    • 4.6.2.1 The longjmp function

本文 更新于: 2025-11-27 09:38:09 创建于: 2025-11-27 09:38:09