天天看點

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;
}  
           

運作結果:

setjmp, longjmp用法簡介

本文旨在個人查閱友善,也希望能幫到看到此文的朋友。