**引言:**
通常要在函數內部實現跳轉,會用到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變量
- (二四)內存分配