当前位置: 代码迷 >> 综合 >> c语言中的setjmp和longjmp简介
  详细解决方案

c语言中的setjmp和longjmp简介

热度:83   发布时间:2024-01-20 02:32:05.0

setjmp将当前程序的运行环境存储在一个jump_buf类型的全局变量中(因为后续要被longjmp调用)

第一次调用setjmp的返回值是null


中后续的代码中执行到longjmp以后,longjmp需要两个参数,一个是之前setjmp保存到运行环境的全局变量可以调整到setjmp函数

另一个参数是setjmp函数的返回值,然后程序执行会跳转到setjmp函数并返回longjmp的第二个参数


通常应将setjmp放在各种条件控制语句中if switch while等


一个例子,参考dash文档


Example

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>jmp_buf jump_buffer;noreturn void a(int count) 
{
      printf("a(%d) called\n", count);longjmp(jump_buffer, count+1); // will return count+1 out of setjmp
}int main(void)
{
      volatile int count = 0; // modified local vars in setjmp scope must be volatileif (setjmp(jump_buffer) != 9) // compare against constant in an ifa(count++);
}

Output:

a(0) called
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called