**引言:**
通常要在函数内部实现跳转,会用到goto语句。如果想要实现不同函数间的跳转,就要用到setjmp和longjmp语句的组合来完成。
**理论分析:**
setjmp和longjmp组合可以实现跳转,与goto语句有相似的地方。但有以下不同:
1、用longjmp只能跳回到曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度看,longjmp更像是“从何处来”而不是“往何处去”。longjmp接收一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然而然来到这里的。
2、goto语句不能跳出C语言当前的函数,而longjmp可以跳的更远,可以跳出函数,甚至跳到其他文件中的函数中。
setjmp(jmp_buf j)必须首先被调用。它表示“使用变量j记录现在的位置”。函数返回零。
longjmp(jmp_buf j, int i)可以接着被调用。它表示“回到j所记录的位置,让它看上去像从原先的setjmp函数返回一样。函数返回i。”
setjmp/longjmp最大的用途是错误恢复。但跟goto一样,使得程序难以理解和调试。如果不是出于特殊需要,最好避免使用它们。
**使用步骤:**
1、包含头文件setjmp.h,定义jmp_buf类型的变量,如jmp_buf buf;
2、调用setjmp(buf);该函数返回0。
3、在想要跳转的地方调用longjmp(buf, i);该函数返回整数i,实现跳转。
**示例源码:**
~~~
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void
fun(void)
{
printf("in fun()\n");
longjmp(buf, 1);
}
void
main(void)
{
if(setjmp(buf)){
printf("back in main.\n");
}else{
printf("first time through\n");
fun();
}
}
~~~
**编译:gcc test.c**
**执行:./a.out**
**结果:**
**first time through
in fun()
back in main.**
- 前言
- (四)回调函数
- (一)while(1)死循环与for(;;)死循环的区别
- (二)static关键字
- (三)函数
- (四)可变参数函数
- (五)setjmp和longjmp
- (六)指针
- (七)回调函数
- (八)字符串
- (九)动态内存分配
- (十)结构体
- (十一)深入理解指针
- (十二)命令行参数
- (十三)printf、fprintf、sprintf和snprintf函数
- (十四)const关键字详解
- (十五)字符串输入函数fgets、gets和scanf
- (十六)字符串输出函数puts、fputs和printf
- (十七)字符/字符串输出函数fputc、fputs、putc、putchar和puts
- (十八)字符/字符串输入函数fgetc、fgets、getc、getchar和gets
- (十九)restrict关键词
- (二十)scanf函数详解
- (二一)内联函数
- (二二)位操作
- (二三)errno变量
- (二四)内存分配