C语言具有的类似try and catch机制,unix下机制也相同。
VC例子:
#include <stdio.h>
#include <setjmp.h>
jmp_buf mark; // 保存stack环境的变量
void main(void)
{
int jmpret;
int result;
jmpret = setjmp( mark ); @1@ // 保存当前stack环境到mark变量
if( jmpret == 0 )
{
scanf("%d",&result);
if(result<0) {
longjmp( mark, -1 ); // 发生错误,恢复保存的stack环境,执行跳转到@1@处,jmpret的值为-1
return;
// 此语句永远不被执行
} else {
printf("Normal!");
return;
}
} else {
// 错误处理
printf("An exception occured!");
}
}
longjmp在Standard C中的说明:
1.用longjmp跳转时保证静态变量有正确的值
2.auto变量只保证拥有volatile类型和在setjmp和longjmp之间没有改变的值。
解释:
1.静态变量保持为在longjmp调用时的值
2.在setjmp和longjmp之间没有改变的值仍然是原值,(很简单,因为从来就没有改变过)
对于一些auto-nonvolatile的值,可能在循环中,编译器为了优化性能,用寄存器来缓存,longjmp跳转时没有赋值,用volatile修饰能阻止编译器优化。