1845

9 分钟

#C 语言标准库函数 longjmp

/********************************************* * @brief 远程跳转 * @param env 要跳转到的上下文 * @param status 作为 setjmp 的返回值 ********************************************/ void longjmp(jup_buf env, int status);

说明

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

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

参数

  • env - 要跳转的执行上下文
  • status - 作为 setjmp 的返回值

返回值

无(此函数不会返回)

#示例

#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/10/16

更新于 2025/10/16