6.5.9 全程跳转函数库

全程跳转函数库提供了程序跳转相关的操作函数,这些函数用于正常系列函数的调用和函数结束,还允许从深层函数调用中直接返回。全程跳转函数包含在头文件setjmp.h中,其函数原型如下。


typedef char jmp_buf[_jblen]

int setjmp(jmp_buf env)

void longjmp(jmp_buf env,int retal)


下面分别介绍各个函数的用法。

❑jmp_buf函数定义用于保存和恢复程序环境的缓冲区,供setjmp和longjmp使用,其必须定义为全局变量。

❑setjmp函数用于将程序执行的当前环境状态信息存入参数env中。当直接调用setjmp时,返回值为0,当从longjmp调用时,返回值为非0。

❑longjmp函数用于恢复先前调用setjmp时存在env中的环境状态信息,并从setjmp语句的下一条语句执行。其中,参数val为调用setjmp的返回值。

下面举例讲解这些函数在具体程序设计中的应用,程序示例如下。


include<setjmp.h>//头文件

include<stdio.h>

jmp_buf env;//环境变量

bit error_flag;//错误标志

void trig(void)//自定义函数

{

if(error_flag!=0)

{

longjmp(env,1);//向setjmp返回1

}

}

void recover(void)//恢复函数

{

}

void main(void)//主函数

{

if(setjmp(env)==0)//首次调用setjmp将返回0

{

printf(“Called SETJMP!\n”);

error_flag=1;//错误标志

trig();//调用trig函数

}

else

{

printf(“Called LONGJMP!\n”);

recover();//调用恢复函数

}

}


该程序可以在KeilµVision3编译环境中执行,运行时将输出如下内容。


Called SETJMP!

Called LONGJMP!


在该程序中,自定义了trig函数。在主函数中,首次调用setjmp函数将返回0,从而执行trig函数。在trig函数中,通过longjmp函数向setjmp函数返回1,则执行recover函数。