- 6
- 0
- 约6.35千字
- 约 9页
- 2021-10-13 发布于福建
- 举报
将对 setjmp 与 longjmp 的具体使用方法和适用的场合,进行一个非常全面的阐
述。
另外请特别注意, setjmp 函数与 longjmp 函数总是组合起来使用,它们是紧密
相关的一对操作, 只有将它们结合起来使用, 才能达到程序控制流有效转移的目
的,才能按照程序员的预先设计的意图, 去实现对程序中可能出现的异常进行集
中处理。
与 goto 语句的作用类似,它能实现本地的跳转
这种情况容易理解,不过还是列举出一个示例程序吧!如下:
void main( void )
{
int jmpret;
jmpret = setjmp( mark );
if( jmpret == 0 )
{
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(1) longjmp(mark, 1);
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(2) longjmp(mark, 2);
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(-1) longjmp(mark, -1);
// 其它代码的执行
}
else
{
// 错误处理模块
switch (jmpret)
{
case 1:
printf( Error 1\n);
break;
case 2:
printf( Error 2\n);
break;
case 3:
printf( Error 3\n);
break;
default :
printf( Unknown Error);
break;
}
exit(0);
}
return;
}
上面的例程非常地简单, 其中程序中使用到了异常处理的机制, 这使得程序
的代码非常紧凑、清晰,易于理解。在程序运行过程中,当异常情况出现后,控
制流是进行了一个本地跳转 (进入到异常处理的代码模块, 是在同一个函数的内
部),这种情况其实也可以用 goto 语句来予以很好的实现,但是,显然 setjmp
与 longjmp 的方式,更为严谨一些, 也更为友善。 程序的执行流如图 17-1 所示。
setjmp 与 longjmp 相结合,实现程序的非本地的跳转
呵呵!这就是 goto 语句所不能实现的。也正因为如此,所以才说在 C语言
中,setjmp 与 longjmp 相结合的方式,它提供了真正意义上的异常处理机制。
其实上一篇文章中的那个例程,已经演示了 longjmp 函数的非本地跳转的场景。
这里为了更清晰演示本地跳转与非本地跳转, 这两者之间的区别, 我们在上面刚
才的那个例程基础上,进行很小的一点改动,代码如下:
void Func1()
{
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(1) longjmp(mark, 1);
}
void Func2()
{
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(2) longjmp(mark, 2);
}
void Func3()
{
// 其它代码的执行
// 判断程序远行中,是否出现错误,如果有错误,则跳转!
if(-1) longjmp(mark, -1);
}
void main( void )
{
int jmpret;
jmpret = setjmp( mark );
if( jmpret == 0 )
{
// 其它代码的执行
// 下面的这些函数执行过程中,有可能出现异常
Func1();
Func2();
Func3();
// 其它代码的执行
}
else
{
// 错误处理模块
switch (jmpret)
{
case
原创力文档

文档评论(0)