setjmp.h
微软编写的这个库可以用来进行问题处理。我大致观看了其中的代码(然而并不能看懂,资历尚浅)。
我们可以用到的有
Int setjmp(jmp_buf env)
以及
Void longjmp(jmp_buf env,int val)
此外不能忘了首先定义一个
jmp_buf
类型的变量,这一数据类型是某种形式的数组(经过看setjmp.h
我发现这是一个int
型的数组),其中存放在调用longjmp
时能用来恢复栈状态的所有信息。
这不同于普通的goto
语句,goto
是区域的跳跃,而longjmp
是直接跨越函数栈的跳跃。因此,这在函数调用使用的时候尤其有效。
第一次运行setjmp
的时候,保存当前的栈状态的信息,return
一定为0,并且设置标记点,即longjmp
之后跳转回的位置。
非第一次运行setjmp
的时候,setjmp
的返回值取决于longjmp
中等于val
的值。这样我们就可以使用多val
值来分别针对不同的可能出错类型。
Example (from wikipedia):
#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {
printf("second\n"); // prints
longjmp(buf,1); // jumps back to where setjmp was called - making setjmp now return 1
}
void first(void) {
second();
printf("first\n"); // does not print
}
int main() {
if (!setjmp(buf))
first(); // when executed, setjmp returned 0
else // when longjmp jumps back, setjmp returns 1
printf("main\n"); // prints
return 0;
}