#include <setjmp.h>
int setjmp(jmp_buf environment);
void longjmp(jmp_buf environment, int value);
C标准库提供了 setjmp() 宏,longjmp() 函数以及一个 jmp_buf 类型来完成异常处理的功能。
- jmp_buf 是一个数组类型,用于保存 setjmp() 和 longjmp() 里的信息。
-
setjmp() 是一个宏,用于将当前环境保存到 environment 里面,供之后 longjmp() 使用。(当前环境也就是调用该宏的位置,之后 longjmp() 使用该 environment 时,会从该位置返回)
该宏调用会返回多次,第一次调用该宏会立即返回,且返回值为 0 。之后该宏返回时机则由 longjmp() 函数调用决定,且本次返回值为 longjmp() 里的第二个参数 value 。 - longjmp() 函数会恢复变量 environment 里保存的环境,该环境是最近一次 setjmp() 保存到 environment 里的环境。参数 value 就是 setjmp() 之后返回的值。
参考例程如下:来自 https://www.tutorialspoint.com/c_standard_library/c_function_longjmp.htm
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int main () {
int val;
jmp_buf env_buffer;
/* save calling environment for longjmp */
val = setjmp( env_buffer );
if( val != 0 ) {
printf("Returned from a longjmp() with value = %s\n", val);
exit(0);
}
printf("Jump function call\n");
jmpfunction( env_buffer );
return(0);
}
void jmpfunction(jmp_buf env_buf) {
longjmp(env_buf, "tutorialspoint.com");
}
结果如下:
Jump function call
Returned from a longjmp() with value = tutorialspoint.com
《C语言接口与实现——创建可重用软件的技术》里使用 setjmp() 和 longjmp() 实现了一套 Except 的异常处理机制,可以学习参考下 setjmp() 和 longjmp() 的设计使用。