setjmp(PC_JumpBuf); /* Capture where we are in DOS */ #define __SETJMP_H www.shengfang.org #if !defined(___DEFS_H) #include <_defs.h> #endif typedef struct __jmp_buf { unsigned j_sp; unsigned j_ss; unsigned j_flag; www.shengfang.org unsigned j_cs; unsigned j_ip; unsigned j_bp; unsigned j_di; unsigned j_es; unsigned j_si; unsigned j_ds; } jmp_buf[1]; #ifdef __cplusplus extern "C" { #endif #if !defined( _Windows ) void _CType longjmp(jmp_buf __jmpb, int __retval); int _CType setjmp(jmp_buf __jmpb); #else void far pascal longjmp( struct __jmp_buf far *__jmpb, int __retval ); int far pascal setjmp( struct __jmp_buf far *__jmpb); #endif #ifdef __cplusplus } #endif #endif 这是BC31里面的定义 #include <stdio.h> #include <dos.h> #include <setjmp.h> jmp_buf ebuf; void f2(void); int main(void) { int i; printf("1"); i=setjmp(ebuf); if(i==0) { f2(); printf("This will not be printed."); } printf("%d",i); getchar(); return 0; www.shengfang.org } void f2(void) { printf("2"); longjmp(ebuf,3); www.shengfang.org } 打印出来是123,就是说longjmp又跳回i=setjmp(ebuf);,结果I=3 Setjmp是标准C语言库函数的组成部分,它可以实现程序执行中的远程转操作。具体来说,它可以在一个函数中使用setjmp来初始化一个全局标号,然后只要该函数未曾返回,那么在其它任何地方都可以通过longjmp调用来跳转到setjmp的下一条语句执行。实际上,setjmp函数将发生调用处的局部环境保存在一个jmp_buf的结构当中,只要主调函数中对应的内存未曾释放(函数返回时局部内存就失效了),那么在调用longjmp的时候就可以根据已保存的jmp_buf参数恢复到setjmp的地方执行。 尊敬的用户: 您好! 由于服务器上有好些域名还没有备案,导致服务器被有关部门暂停开放,我们已经和有关部门协商尽快开放服务器,敬请原谅! 请还没有备案的域名尽快去信产部备案,以免这种情况再次发生,谢谢合作!! 字体:大 中 小 |