相信大家对goto不会太陌生,但是恐怕setjmp和longjmp就不是很熟悉了。
以下是一段示例程序,将帮助你理解:
#include "setjmp.h"
//声明一个记录变量
jmp_buf buf;
void Banana(){
printf("in banana()/n");
//session 2:使用longjmp实现跳转回到buf记录的位置.且返回1
longjmp(buf, 1);
/*以下代码不会被执行*/
printf("you'll never see this, because longjmp/n");
}
int main(int argc, char* argv[])
{
printf("Hello World!/n");
//session 1:使用setjmp,记录下当前的位置,保存于buf中.且返回0
if(setjmp(buf)){
printf("back in main/n");
}else{
printf("first time through/n");
Banana();
}
//conclusion :可以使用setjmp 和 longjmp实现跳转,它们跟goto最大的区别在于
//1)goto不能跳出C语言当前的函数(这也是longjmp取名的由来,它可以跳得很远,
//甚至可以跳转到其他文件的函数中)
//2)longjmp只能跳回曾经到过的地方(即setjmp调用的地方)
//但是和goto一样 setjmp 和 longjmp同样会使程序变得难以理解和调试。如果不是出于特殊需要
//最好避免使用它们
return 0;
}
first time through
in banana()
back in main