首页 > 其他分享 >setjmp使用

setjmp使用

时间:2022-12-27 17:11:41浏览次数:64  
标签:exception longjmp goto 使用 setjmp printf 函数

当 setjmp 和 longjmp 一起使用时,它们提供了一种执行非本地 goto 的方法。 它们通常在 C 代码中用于将执行控制传递给先前调用的例程中的错误处理或恢复代码,而不使用标准调用或返回约定。

由于 setjmp 和 longjmp 不支持在 C++ 编译器之间以可移植的方式正确销毁堆栈帧对象,并且它们可能会因阻止优化局部变量而降低性能,因此不建议在 C++ 程序中使用。 建议改用 try 和 catch 构造。

 

abort函数和exit函数的直接退出非常直接,goto语句使用起来更温柔。但是goto是本地的,它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点。

为了解决这个限制,C函数库提供了setjmp函数和longjmp函数,它们分别承担非局部标号goto作用。需要包含头文件<setjmp.h>,在其中申明了这些函数及的jmp_buf数据类型。

  原理:

  1. setjmp(j)设置“jump”点<goto>,用正确的程序上下文填充jmp_buf对象j(static jmp_buf j)。这个上下文包括程序存放位置、栈和页框指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp函数返回0值。

  2.以后调用longjmp(j,n)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp函数处)。当作为长跳转的目标而被调用时,setjmp()返回n或1,(setjmp函数不能在这种情况时返回0)。

  通过不同的返回值,setjmp函数让你知道它当前使用情况。当设置j时,setjmp函数如你期望地执行即返回0;但当作为长跳转的目标时,setjmp函数就从外面“唤醒”它的上下文。你可以用longjmp函数来终止异常,用setjmp函数标记相应的异常处理程序。

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

static jmp_buf j;

void __exception(void)
{
  printf("Show exception.\n");
  longjmp(j, 1); /* jump to exception handler case 1 */
  printf("This line will never be appeared.\n");
}

 

int main(void)
{
  switch (setjmp(j)) {
  case 0:
    printf("''setjmp'' initialization.\n");
    __exception();
    printf("This line will be never appeared.\n");

    break;
  case 1:
    printf("Deal with exception branch.\n");break;
  default:
  break;
  }
  return 0;
}

标签:exception,longjmp,goto,使用,setjmp,printf,函数
From: https://www.cnblogs.com/kean0048/p/17008506.html

相关文章

  • 是时候使用Kotlin编程了
    从事Android开发的童鞋都知道,自从去年的GoogleI/O大会上Kotlin被定为Android开发的官方语言以来,关于Kotlin就成为每个开发人员学习的目标,的确,Kotlin以它独有的魅力正在吸引......
  • 使用 Spring 构建 REST 服务
    REST已迅速成为在Web上构建Web服务的事实标准,因为它们易于构建和使用。关于REST如何适应微服务领域,还有更大的讨论,但是在本教程中,让我们只看一下构建RESTful服务。......
  • 体素建模神器——MagicaVoxel使用教程简易教学(附软件下载)
    体素是体积元素的简称,是三维空间中分割的最小单位,大家可以把三维中的体素看做是二维空间的像素。今天我们来介绍一款特别轻便的体素编辑程序——MagicaVoxel。MagicaVoxel......
  • C#使用Aspose将Word\HTML 转换成PDF文件
    写在前面Aspose这个是收费的,直接使用是有水印的需要用到的dll文件==> Aspose.Words.dll、Aspose.HTML.dll、Aspose.Total.lic(授权文件)我使用的是.NETFramework4.0......
  • 通过使用阿里云容器镜像服务构建k8s下载不到的镜像
    前因:因为要搭建ingress-nginx,根据官方提供的yaml文档,里面有2处用的到的镜像是需要从registry.k8s.io下载的,虚拟机无法访问到该地址,因为我们这里使用阿里云的容器镜像服务来......
  • fc设备识别使用
    1.存储映射2.multipath下载启用yuminstalldevice-mapper-multipath/sbin/mpathconf--enable  ......
  • DSP+ZYNQ多核例程使用手册-XQTyer【开源】
    【开源资料】XQTyer评估板例程使用手册.pdf链接:​​https://share.weiyun.com/8csewUvh​​密码:8r9by7XQ6657Z35/45-EVM高速数据处理评估板(XQTyer评估板,包含一片TIDSP......
  • 使用 VS 代码构建指南
    本指南将引导你使用VSCode生成入门指南之一。您将构建的内容您将选择一个Spring指南并将其导入VSCode中。然后,您可以阅读指南,处理代码并运行项目。你需要什么约15分......
  • 使用awk过滤出来eth0的IP
    原始输出[root]#ifconfigeth0Linkencap:EthernetHWaddr6C:92:BF:2B:DC:2Finetaddr:100.8.73.88Bcast:100.8.73.255Mask:255.255.255.0......
  • wininet https请求——不使用openssl也是可以的
     //WinINetHTTPSGet//https请求:https://github.com/netdata/netdata/blob/master/CMakeLists.txt#include<iostream>#include<Windows.h>#include<WinInet.h>......