C标准库——setjmp(),longjmp()

#include <setjmp.h>

int setjmp(jmp_buf environment);
void longjmp(jmp_buf environment, int value);

C标准库提供了 setjmp() 宏,longjmp() 函数以及一个 jmp_buf 类型来完成异常处理的功能。

  • jmp_buf 是一个数组类型,用于保存 setjmp() 和 longjmp() 里的信息。
  • setjmp() 是一个宏,用于将当前环境保存到 environment 里面,供之后 longjmp() 使用。(当前环境也就是调用该宏的位置,之后 longjmp() 使用该 environment 时,会从该位置返回)
    该宏调用会返回多次,第一次调用该宏会立即返回,且返回值为 0 。之后该宏返回时机则由 longjmp() 函数调用决定,且本次返回值为 longjmp() 里的第二个参数 value 。
  • longjmp() 函数会恢复变量 environment 里保存的环境,该环境是最近一次 setjmp() 保存到 environment 里的环境。参数 value 就是 setjmp() 之后返回的值。

参考例程如下:来自 https://www.tutorialspoint.com/c_standard_library/c_function_longjmp.htm

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

int main () {
   int val;
   jmp_buf env_buffer;

   /* save calling environment for longjmp */
   val = setjmp( env_buffer );
   
   if( val != 0 ) {
      printf("Returned from a longjmp() with value = %s\n", val);
      exit(0);
   }
   
   printf("Jump function call\n");
   jmpfunction( env_buffer );
   
   return(0);
}

void jmpfunction(jmp_buf env_buf) {
   longjmp(env_buf, "tutorialspoint.com");
}

结果如下:

Jump function call
Returned from a longjmp() with value = tutorialspoint.com

《C语言接口与实现——创建可重用软件的技术》里使用 setjmp() 和 longjmp() 实现了一套 Except 的异常处理机制,可以学习参考下 setjmp() 和 longjmp() 的设计使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容