【C语言天天练(五)】setjmp和longjmp

setjmp和longjmp组合可以实现跳转,与goto语句有相似的地方。但有以下不同:

1、用longjmp只能跳回到曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度看,longjmp更像是“从何处来”而不是“往何处去”。longjmp接收一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然而然来到这里的。

2、goto语句不能跳出C语言当前的函数,而longjmp可以跳的更远,可以跳出函数,甚至跳到其他文件中的函数中。

setjmp(jmp_buf j)必须首先被调用。它表示“使用变量j记录现在的位置”。函数返回零。

longjmp(jmp_buf j, int i)可以接着被调用。它表示“回到j所记录的位置,让它看上去像从原先的setjmp函数返回一样。函数返回i。

setjmp/longjmp最大的用途是错误恢复。但跟goto一样,使得程序难以理解和调试。如果不是出于特殊需要,最好避免使用它们。

使用步骤:

1、包含头文件setjmp.h,定义jmp_buf类型的变量,如jmp_buf buf;

2、调用setjmp(buf);该函数返回0。

3、在想要跳转的地方调用longjmp(buf, i);该函数返回整数i,实现跳转。

示例源码:

#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

void
fun(void)
{
	printf("in fun()\n");
	longjmp(buf, 1);
}

void 
main(void)
{
	if(setjmp(buf)){
		printf("back in main.\n");	
	}else{
		printf("first time through\n");
		fun();
	}
}
编译:gcc test.c

执行:./a.out

结果:

first time through
in fun()
back in main.

【C语言天天练(五)】setjmp和longjmp,布布扣,bubuko.com

【C语言天天练(五)】setjmp和longjmp

上一篇:c++大作业--学籍管理系统--


下一篇:Spring的依赖注入