头文件: setjmp.h
函数原型: int setjmp(jmp_buf state);
void longjmp(jmp_buf state, int value);
setjmp和longjmp函数提供了实现类似goto语句的机制,首先声明一个jmp_buf变量,并调用setjmp函数对其初始化,setjmp的返回值为0。setjmp吧程序的状态信息保持到跳转缓冲区中。调用setjmp时所处的函数便成为“顶层函数”。以后,在“顶层函数”或它所调用的函数(包括直接调用和间接调用)内的任何地方调用longjmp函数,将导致这个保存的状态重新恢复。longjmp的效果就是使执行流通过再次从setjmp函数返回,从而立即跳回到“顶层函数”中。当setjmp函数第1次被调用时,它返回0.当setjmp作为longjmp的执行结果再次返回时,它的返回值时longjmp的第2个参数,它必须时一个非零值。通过检查它的返回值,程序可以判断是否调用了longjmp。如果存在多个longjmp,可可以由此来判断是哪个longjmp被调用。
一个简单的示例:
#include <stdio.h>
#include <setjmp.h>
jmp_buf state;
void banana() {
printf("in banana\n");
longjmp(state, 1);
printf("You will never see this, because I longjmped\n");
}
int main() {
if(setjmp(state))
printf("back in main\n");
else {
printf("first time in through\n");
banana();
}
return 0;
}
结果输出:
first time in through
in banana
back in main