setjmp()/longjmp()

非局部跳转语句: setjmp和longjmp函数。
非局部指不像普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。

1
2
3
#include <setjmp.h>
int setjmp(jmp_buf env); //返回值:若直接调用则返回0,
void longjmp(jmp_buf env,int val); //若从longjmp调用返回则返回非0值

·在希望返回到的位置调用setjmp,此位置在main函数中,因为直接调用该函数,所以其返回值为0
setjmp参数evn的类型是一个特殊的类型jmp_buf,这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。因为需要在另一个函数中引用env变量,所以规范的处理方式是将env变量定义为全局变量。
·当检查到一个错误时,则以两个参数调用longjmp函数,第一个就是在调用setjmp时所用的env,第二个参数是具有非0值的val,它将成为从setjmp处返回的值。使用第二个参数的原因是对于一个setjmp可以有多个longjmp。

Comments

2016-03-17