完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 QQ3511836582 于 2017-5-17 15:50 编辑
大家知道在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就不可能返回了, 因此在使用它们进行跳转时要谨慎操作。 信盈达在面对巨大挑战的同时,在业务和课程方面不断加大投入,在接下来的2017课程研发上投入的预算高达企业总营收的10%,真正体现了“专业始于专注,卓识源自远见”的企业发展理念。而出色的质量控制和学员的高度认可,则成为信盈达创业10多年的立足之本,为信盈达树立了良好的企业形象,也为未来持续稳定的快速发展奠定了坚实基础。 |
|
相关推荐
|
|
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
1858 浏览 0 评论
2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
11689 浏览 11 评论
2032 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
3433 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1228 浏览 0 评论
68540 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
68752 浏览 22 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-18 01:20 , Processed in 0.494888 second(s), Total 69, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号