当前位置:
首页 >
setjump和longjump
发布时间:2023/12/2
60
豆豆
生活随笔
收集整理的这篇文章主要介绍了
setjump和longjump
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
int setjmp( jmp_buf env );
void longjmp( jmp_buf env, int value );
# setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf 对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump 的上下文,setjmp()返回0 值。对setjmp函数的调用时,会保存程序当前的堆栈环境到env参数中;
# 以后调用longjmp(j,r)的效果就是一个“长跳转”到由j 描述的上下文处(也就是到那原来设置j 的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r 或1(如果r 设为0 的话)。(记住,setjmp()不能在这种情况时返回0。
通常, 用longjmp()来终止异常,用setjmp()标记相应的异常处理程序, 在调用setjmp的函数返回之前,调用longjmp,否则结果不可预料。
在使用longjmp时,请遵守以下规则或限制:
$ 不要假象寄存器类型的变量将总会保持不变。在调用longjmp之后,通过setjmp所返回的控制流中,例程中寄存器类型的变量将不会被恢复。
$ 不要使用longjmp函数,来实现把控制流,从一个中断处理例程中传出,除非被捕获的异常是一个浮点数异常。在后一种情况下,如果程序通过调用_fpreset函数,来首先初始化浮点数包后,它是可以通过longjmp来实现从中断处理例程中返回。
$ 在C++程序中,小心对setjmp和longjmp的使用,应为setjmp和longjmp并不能很好地支持C++中面向对象的语义。因此在C++程序中,使用C++提供的异常处理机制将会更加安全。
#include <conio.h>
#include <setjmp.h>
void RaiseException ( jmp_buf jmpbuf)
{
printf( "Press a key to restore stack environment...\n" ) ;
getch() ;
longjmp(jmpbuf, 1);
}
int main()
{
jmp_buf jmpbuf ;
int result ;
printf( "Save stack environment...\n" ) ;
result = setjmp(jmpbuf) ;
if( result == 0 )
{
//Do something
//If anything wrong.
RaiseException(jmpbuf) ;
}
else// the exception handler, return by longjump, non-zero value
{
printf( "longjump() returned %d.\n", result ) ;
exit(0) ;
}
return 0 ;
}
程序输出将是如下序列:
Saving stack environment...
Call MyFunc()...
Press a key torestore stack environment...
setjmp() returned 1
//Example 2
#include <stdio.h>
#include <setjmp.h>
jmp_buf save;
void main()
{
char c;
for (;; )
{
switch ( setjmp( save ))
{
case 0:
printf ( "Zero returned from setjmp on setup.\n\n");
break;
case 1:
printf ( "NORMAL PROGRAM OPERATION\n\n" );
break;
case 2:
printf ( "WARNING\n\n" );
break;
case 3:
printf ( "FATAL ERROR PROGRAM TERMINATED\n\nReally Terminate? y/n: " );
fflush ( stdout );
scanf ( "%1s", &c );
c = tolower ( c );
if ( c == 'y' ) return ( 1 );
printf ( "\n" ); break;
default:
printf ( "Should never return here.\n" );
break;
}
process ();
}
}
void process ()
{
int i;
printf ( "Input a number to simulate an error condition: " );
fflush ( stdout ); scanf ( "%d", &i ); i %= 3;
i++;
longjmp ( save, i);
}
总结
以上是生活随笔为你收集整理的setjump和longjump的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: C/C++中的运算符优先级总结
- 下一篇: static函数与普通函数区别