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;
}
運作結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zZihGbHRGcW1mW2A3MkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TMzADMyATN2EDNxcDMzEDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
本文旨在個人查閱友善,也希望能幫到看到此文的朋友。