加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

操作C说话中的Setjmp和Longjmp,来完美非常捕捉和协程

发布时间:2021-06-01 19:06:37 所属栏目:编程 来源:互联网
导读:一、媒介 在 C 尺度库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道列位小搭档在代码中是否行使过?我问了身材的几位同事,一部门人不熟悉这两个函数,有

在 C 尺度库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道列位小搭档在代码中是否行使过?我问了身材的几位同事,一部门人不熟悉这两个函数,有一部门人知道这个函数,但从来没有行使过。

从常识点范畴来看,这两个函数的成果较量纯真,一个简朴的示例代码就能说清晰了。可是,我们必要从这个常识点举办发散、思索,在差异的维度上,把这个常识点与这个编程说话中其余相同的常识举办遐想、比拟;与其他编程说话中相同的观念举办较量;然后再思索这个常识点可以行使在哪些场所,别人是怎么来行使它的。

本日,我们就来掰扯掰扯这两个函数。固然在一样平常的措施中行使不上,可是在此后的某个场所,当你必要处理赏罚一些较量怪异的措施流程时,大概它们可以给你带来意想不到的结果。

譬喻:我们会把 setjmp/longjmp 与 goto 语句举办成果上的较量;与 fork 函数从返回值长举办类比;与 Python/Lua 说话中的协程举办行使场景上的较量。

二、函数语法先容

1. 最简示例

先不讲原理,直接看一下这个最简朴的示例代码,看不懂也不要紧,混个脸熟:

int main() 

    // 一个缓冲区,用来暂存情形变量 

    jmp_buf buf; 

    printf("line1 n"); 

     

    // 生涯而今的上下文信息 

    int ret = setjmp(buf); 

    printf("ret = %d n", ret); 

     

    // 搜查返回值范例 

    if (0 == ret) 

    { 

        // 返回值0:声名是正常的函数挪用返回 

        printf("line2 n"); 

         

        // 主动跳转到 setjmp 那条语句处 

        longjmp(buf, 1); 

    } 

    else 

    { 

        // 返回值非0:声名是从长途跳转过来的 

        printf("line3 n"); 

    } 

    printf("line4 n"); 

    return 0; 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读