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;
}

image

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 异常的代码
}
posted @ 2022-11-14 20:20  一条晓鱼ovo  阅读(35)  评论(0编辑  收藏  举报