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函数。