- C 标准库
- C 库 - 首页
- C 库 - <assert.h>
- C 库 - <complex.h>
- C 库 - <ctype.h>
- C 库 - <errno.h>
- C 库 - <fenv.h>
- C 库 - <float.h>
- C 库 - <inttypes.h>
- C 库 - <iso646.h>
- C 库 - <limits.h>
- C 库 - <locale.h>
- C 库 - <math.h>
- C 库 - <setjmp.h>
- C 库 - <signal.h>
- C 库 - <stdalign.h>
- C 库 - <stdarg.h>
- C 库 - <stdbool.h>
- C 库 - <stddef.h>
- C 库 - <stdio.h>
- C 库 - <stdlib.h>
- C 库 - <string.h>
- C 库 - <tgmath.h>
- C 库 - <time.h>
- C 库 - <wctype.h>
- C 标准库资源
- C 库 - 快速指南
- C 库 - 有用资源
- C 库 - 讨论
C 库 - longjmp() 函数
C 库的 longjmp() 函数恢复了在程序同一调用中由最近一次对 setjmp() 宏的调用(使用相应的 jmp_buf 参数)保存的环境。
假设在许多其他函数内的嵌套函数中发生错误,并且错误处理为顶级函数创建了一种意义。对于所有中间任务来说,正常返回并评估返回值或全局错误变量以确定进一步处理的有效性或无效性将更加困难。因此,longjmp() 提供了一个非本地跳转回程序中的特定点,并且通常函数会调用更高一级的栈。
语法
以下是 C longjmp() 函数的语法:
void longjmp(jmp_buf environment, int value)
参数
此函数接受以下参数:
- environment - 这是一个 jmp_buf 类型的对象,包含在 setjmp 调用点恢复环境的信息。
- value - 这是 setjmp 表达式计算结果的值。
返回值
此函数不返回任何值。
示例 1
以下是一个基本的 C 程序,用于演示 longjmp() 函数。
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int main() {
int val;
jmp_buf env_buffer;
/* Save calling environment for longjmp */
val = setjmp(env_buffer);
if (val != 0) {
printf("Returned from a longjmp() with value = %d\n", val);
exit(0);
}
printf("Jump function call\n");
jmpfunction(env_buffer);
return 0;
}
void jmpfunction(jmp_buf env_buf) {
longjmp(env_buf, 50);
}
输出
执行代码后,我们得到以下结果:
Jump function call Returned from a longjmp() with value = 50
示例 2
下面的程序描述了 longjmp 函数,它使用 setjmp.h 头文件设置跳转点并在 jump_buffer 中保存当前执行上下文。然后通过调用自定义函数 error_handler 触发错误。最后,程序流程在跳转后返回到 main() 并允许进行错误处理。
#include <stdio.h>
#include <setjmp.h>
jmp_buf jump_buffer;
void error_handler() {
printf("The error is detected! Jumping back to main...\n");
longjmp(jump_buffer, 1);
}
int main() {
if (setjmp(jump_buffer) == 0) {
// Normal execution
printf("Welcome to the program!\n");
printf("Let's simulate an error...\n");
error_handler();
}
else {
// Error handling
printf("Back in main after longjmp().\n");
printf("Error handling success.\n");
}
return 0;
}
输出
执行上述代码后,我们得到以下结果:
Welcome to the program! Let's simulate an error... The error is detected! Jumping back to main... Back in main after longjmp(). Error handling success.
广告