西安建設(shè)網(wǎng)站排名自媒體發(fā)布軟件app
目錄
前言
setjmp宏
longjmp函數(shù)
使用方法:
實例:測試setjmp與longjmp的使用
前言
通常情況下,函數(shù)會返回到它被調(diào)用的位置,我們無法使用goto語句改變它的返回的方向,因為goto語句只能跳轉(zhuǎn)到同一函數(shù)內(nèi)的某個標(biāo)號處,但是<setjmp.h>中包含的setjmp宏與longjmp函數(shù)可以使一個函數(shù)直接跳轉(zhuǎn)至另一個函數(shù),不需要返回
setjmp宏
原型:int setjmp(jmp_buf env);
作用:在程序中標(biāo)記一個位置
C標(biāo)準(zhǔn)要求jmp_buf必須是一個數(shù)組類型,因此傳遞給setjmp的實際上是一個指向數(shù)組的數(shù)組指針
longjmp函數(shù)
函數(shù)原型:_Noreturn void longjmp(jmp_buf env,int val);
作用:跳轉(zhuǎn)至setjmp宏標(biāo)記的位置
使用方法:
1、調(diào)用set'jmp宏,為跳轉(zhuǎn)標(biāo)記一個位置(調(diào)用參數(shù)是一個jmp_buf類型的變量),setjmp會將一個指向自身位置的指針放入該變量中,以便將來longjmp函數(shù)的使用,最后返回0
2、longjmp函數(shù)根據(jù)setjmp提供的jum_buf類型的參數(shù)跳轉(zhuǎn)至setjmp宏所在的位置,然后使得setjmp再次返回一個值val(longjmp的第二個參數(shù)值)
3、總之,setjmp會在第一次調(diào)用時返回0,在后續(xù)的調(diào)用時返回val(longjmp的第二個參數(shù)值)
注意事項:?
1、確保longjmp的env參數(shù)一定已經(jīng)被setjmp初始化過
2、包含setjmp最初調(diào)用的函數(shù)一定不能在調(diào)用longjmp之前返回
實例:測試setjmp與longjmp的使用
#include <stdio.h>
#include <setjmp.h> jmp_buf env;
void f1();
void f2();void f1()
{printf("f1 begins\n");f2();printf("f1 returns\n");
}void f2()
{printf("f2 begins\n");longjmp(env,1);printf("f2 returns\n");
}int main()
{if (setjmp(env) == 0){printf("setjmp returned 0\n");}else{printf("Program terminates: longjmp called\n");return 0;}f1();printf("Program terminates normally");return 0;
}
~over~