#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