当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 关于linux中非局部跳转的简单使用

关于linux中非局部跳转的简单使用 时间:2018-09-21      来源:未知

大家知道在C语言中有一个不是经常使用的关键字,那就是goto。goto语句在编程的过程中如果滥用的话就会造成整个代码逻辑容易混乱,大大降低了代码的可读性和可维护性。而且即使使用goto语句进行跳转也是有局限性的,那就是goto语句是一个实现局部跳转的关键字,也就是只能在一个函数中进行跳转,它是无法在不同的函数中实现跳转的。那么如何实现在不同的函数中进行非局部的跳转呢?而setjmp和longjmp函数就可以帮助我们实现。

setjmp和longjmp函数是库函数,那么setjmp和longjmp如何使用呢?下边咱们看一下函数接口。

int setjmp(jmp_buf env);

功能:就是确定longjmp的返回目标,我们可以通过返回值来确定setjmp函数的调用是第一次调用,还是longjmp返回。如果返回值是0,那么表示是设置longjmp的返回位置,否则表示是从longjmp中返回。

void longjmp(jmp_buf env, int val);

功能:执行跳转,其中参数env就是setjmp函数设置后的env,参数val就是返回到setjmp位置之后setjmp的返回值。

示例代码如下:

#include

#include

jmp_buf env;

void fun(void)

{

puts("in the fun");

longjmp(env, 1);

}

int main(int argc, char *argv[])

{

switch (setjmp(env))

{

case 0:

puts("setjmp first ..");

break;

case 1:

puts("return from fun ..");

break;

}

fun();

return 0;

}

虽然使用setjmp和longjmp函数的组合可以实现非局部的跳转,但是在使用时也需要谨慎。比如下边的例子:

void fun_1(void)

{

….

setjmp(env);

….

return;

}

void fun_2(void)

{

….

Longjmp(env, 1);

}

该代码实现了从fun_2函数中跳回到fun_1函数中,但是如果在执行longjump函数时fun_1函数已经返回,那么就longjmp的返回就会出错,因为fun_1函数调用完毕之后栈帧就会被其他函数使用,那么longjmp就不可能返回了, 因此在使用它们进行跳转时要谨慎操作。

上一篇:Thumb 编程模型

下一篇:java代码与纯C代码混编完成android应用的开发

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部