c语言高级api setjmp longjmp 处理异常
1 setjmp
c语言里面有goto语句,但是goto只能在函数内跳转.setjmp就是可以实现跨函数跳转的.
第一次调用setjmp函数会设置一个跳转点,函数的返回值为零.类似于为goto设置一个标签一样.
然后通过longjmp函数跳转回来,并指定一个返回值.
例子:
#include <stdio.h>
#include <setjmp.h>
void fun_1(){
printf("fun_1()\n");
}
void fun_2(){
printf("fun_2()\n");
}
int main() {
while(1){
fun_1();
fun_2();
}
return 0;
}
用跳转实现
#include <stdio.h>
#include <setjmp.h>
jmp_buf to_fun_1;
void fun_2(){
printf("fun_2()\n");
longjmp(to_fun_1, 100);
}
void fun_1(){
int ret = setjmp(to_fun_1);
printf("fun_1() ret = %d\n", ret);
fun_2();
}
int main() {
fun_1();
return 0;
}
2 处理异常
一般借用返回值来实现异常处理.
jmp_buf to_fun_1;
void fun_2(){
printf("fun_2()\n");
longjmp(to_fun_1, 100);
}
void fun_1(int x){
int y = x;
if (0 == setjmp(to_fun_1)){
// 保护代码块
printf("fun_1()\n");
fun_2();
} else{
//异常处理
return;
}
}
int main() {
fun_1(0);
return 0;
}
对比一下c++的异常处理.
try
{
// 保护代码
}catch( ExceptionName e )
{
// 处理 ExceptionName 异常的代码
}