setjmp, longjmp用法简介

setjmp和longjmp其实就是goto的升级版,goto只能在同一个函数中跳转,但是setjmp和longjmp可以实现在不同的函数之间跳转。

下面是一个简单的示例演示,代码+运行结果,几行注释应该足以说明setjmp和longjmp的用法。


#include <stdio.h>
#include <setjmp.h>

#define TOK_ADD 5
#define MAXLINE 40

jmp_buf jmpbuffer;
char *tok_ptr;

void do_line(char *ptr);
void cmd_add(void);
int  get_token(void);

int main(int argc, char **argv)
{
    char line[MAXLINE];
    int  ret = 0;

    if ((ret = setjmp(jmpbuffer)) != 0) //类似于goto所用的tag,告诉longjmp应该返回到哪里
    {   
        printf("error:%d\n", ret);
    }   

    while (fgets(line, MAXLINE, stdin) != NULL)
    {   
        do_line(line);
    }   

    return 0;
}



void do_line(char *ptr)
{
    int cmd;

    tok_ptr = ptr;
    while ((cmd = get_token()) > 0)
    {   
        switch (cmd)
        case TOK_ADD:
            cmd_add();
            printf("cmd add complete\n"); //this will not be printed out
            break;
    }   
}

void cmd_add(void)
{
    int token;
    token = get_token();
    if (token > 0)
    {
        longjmp(jmpbuffer, 2); //第2个参数“2”,会是setjmp的返回值
    }
}

int get_token(void)
{
    return TOK_ADD;
}  

运行结果:

本文旨在个人查阅方便,也希望能帮到看到此文的朋友。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值