1.C语言的异常处理利用的是longjmp
longjmp 与goto的作用类似,但作用域差异很大。
longjmp不限于函数内部。
2.使用时需要使用c标准库中的setjmp.h
jmp_buf 是setjmp.h中定义的一个结构体
使用时,先实例化一个结构体
利用setjmp来进行赋值。setjmp返回0则实例化成功。
然后再利用longjmp进行对应的跳转。
跳转的到的地方即setjmp()的地方,其setjmp的返回值对应的就是longjmp的第二个参数。
2.举个例子:
#include#include #include jmp_buf errBuf; void checkJmpFlag(int jmpFlag); void sendErr(); int main(){ int jmpFlag=setjmp(errBuf); checkJmpFlag(jmpFlag); sendErr(); return 0; } void checkJmpFlag(int jmpFlag){ if(jmpFlag==0){ } else{ printf("Error: JmpFlag"); exit(-1); } } void sendErr(){ longjmp(errBuf,-5); }
对应的输出如下
$ ./testLongJmp Error: JmpFlag
3. 注意:
longjmp似乎只能向前跳转无法向后跳转。
对应的测试例子
#include#include #include jmp_buf errBuf; void checkJmpFlag(int jmpFlag); void sendErr(); int main(){ sendErr(); int jmpFlag=setjmp(errBuf); checkJmpFlag(jmpFlag); return 0; } void checkJmpFlag(int jmpFlag){ if(jmpFlag==0){ } else{ printf("Error: JmpFlag"); exit(-1); } } void sendErr(){ longjmp(errBuf,-5); }
输出结果
$ ./testLongJmp
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)