C语言错误处理之“非局部跳转<setjmp.h>头文件”
目录
前言
setjmp宏
longjmp函数
使用方法:
实例:测试setjmp与longjmp的使用
前言
通常情况下,函数会返回到它被调用的位置,我们无法使用goto语句改变它的返回的方向,因为goto语句只能跳转到同一函数内的某个标号处,但是<setjmp.h>中包含的setjmp宏与longjmp函数可以使一个函数直接跳转至另一个函数,不需要返回
setjmp宏
原型:int setjmp(jmp_buf env);
作用:在程序中标记一个位置
C标准要求jmp_buf必须是一个数组类型,因此传递给setjmp的实际上是一个指向数组的数组指针
longjmp函数
函数原型:_Noreturn void longjmp(jmp_buf env,int val);
作用:跳转至setjmp宏标记的位置
使用方法:
1、调用set'jmp宏,为跳转标记一个位置(调用参数是一个jmp_buf类型的变量),setjmp会将一个指向自身位置的指针放入该变量中,以便将来longjmp函数的使用,最后返回0
2、longjmp函数根据setjmp提供的jum_buf类型的参数跳转至setjmp宏所在的位置,然后使得setjmp再次返回一个值val(longjmp的第二个参数值)
3、总之,setjmp会在第一次调用时返回0,在后续的调用时返回val(longjmp的第二个参数值)
注意事项:
1、确保longjmp的env参数一定已经被setjmp初始化过
2、包含setjmp最初调用的函数一定不能在调用longjmp之前返回
实例:测试setjmp与longjmp的使用
#include <stdio.h>
#include <setjmp.h>
jmp_buf env;
void f1();
void f2();
void f1()
{
printf("f1 begins\n");
f2();
printf("f1 returns\n");
}
void f2()
{
printf("f2 begins\n");
longjmp(env,1);
printf("f2 returns\n");
}
int main()
{
if (setjmp(env) == 0)
{
printf("setjmp returned 0\n");
}
else
{
printf("Program terminates: longjmp called\n");
return 0;
}
f1();
printf("Program terminates normally");
return 0;
}
~over~