setjmp()和longjum()是通过操纵过程活动记录实现的。它是C语言所独有的。它们部分你不了C语言有限的转移能力。这个两个函数协同工作,如下所示:
    *setjmp(jmp_buf j)必须首先被调用。它表示“使用变量j记录现在的位置。函数返回零。”
    *longjmp(jmp_buf j,int i)可以接着被调用。它表示“回到j所记录的位置,让它看上去像是从原来的setjmp()函数返回一样。但是函数返回i,使代码知道它实际上是通过longjmp()返回的。“坳口不?
    *当使用longjmp()时,j的内容被销毁。
    setjmp保存了一份程序的计数器和当前的栈顶指针。如果喜欢也可以保存一些初始值。longjmp恢复这些值,有效的转移控制并把状态重置回保存状态的时候。这被称做“展开堆栈(unwinding stack)",因为你从堆栈中展开过程活动记录,直到取得保存在其中的值。尽管longjmp会导致转移,但它和goto又有不同,区别如下:
    *goto语句不能跳出C语言当前的函数(这也是“longjmp”取名的由来,它可以跳的很远,甚至可以跳到其他文件的函数中)。
    *用longjmp只能跳回到曾经到过的地方。在setjmp的地方仍留有一个过程活动记录。从这个角度讲,longjmp更像是“从何处阿里(come from)“而不是”往哪里去(go to)”。longjmp接受一个额外的整型参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上条语句执行后自然而然来的这里的。
    下面的代码显示了setjmp()和longjmp()一例。
     #include <stdio.h>
     #include <setjmp.h>
     jmp_buf buf;
 
     banana() {
         printf("%s","in banana() \n");
         longjmp(buf,1);
         printf("%s","you will never see this \n");
     }
 
     int main() {
         if(setjmp(buf)) {
             printf("%s","back in main\n");
         }
         else {
             printf("%s","first time throught\n");
             banana();
         }
     }
    输出结果如下:
    first time throught
    in banana()
    back in main
    需要注意的地方是:保证局部变量在longjmp过程中一直保持它的值的唯一可靠方法是把它声明为volatile(这使用于那些值在setjmp执行和longjmp返回之间会改变的变量)
    setjmp/longjmp最大的用途是错误恢复。只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始。有些人使用setjmp/longjmp从一串无数的函数调用中立即返回。还有些人用它们防范潜在的危险代码。
    setjmp/longjmp在C++中演变为更普通的异常处理机制"catch"和"throw"。

C异常处理机制:setjmp和longjmp相关推荐

  1. C异常处理实现: setjmp和longjmp

    此文为internet上选摘,过后我会用自己的理解补充此文. ------------ 将对setjmp与longjmp的具体使用方法和适用的场合,进行一个非常全面的阐述. 另外请特别注意,setjm ...

  2. C语言异常处理之 setjmp()和longjmp()

    异常处理之除0情况 相信大家处理除0时,都会通过函数,然后判断除数是否为0,代码如下所示: double divide(doublea,double b) {const double delta = ...

  3. c语言c2182是什么错误,C语言中一种更优雅的异常处理机制

    上一篇文章对C语言中的goto语句进行了较深入的阐述,实际上goto语句是面向过程与面向结构化程序语言中,进行异常处理编程的最原始的支持形式.后来为了更好地.更方便地支持异常处理编程机制,使得程序员在 ...

  4. setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto

    目录 1. 应用场景 2. Use Case Code Analysis 3. 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer O ...

  5. [转]全面了解setjmp与longjmp的使用

                          将对setjmp与longjmp的具体使用方法和适用的场合,进行一个非常全面的阐述. 另外请特别注意,setjmp函数与longjmp函数总是组合起来使用, ...

  6. C++ 为什么要引入异常处理机制

    1.异常处理的困难 在程序设计中,错误是不可避免的.及时有效的发现错误,并作出适当的处理,无论是在软件的开发阶段还是在维护阶段都是至关重要的.错误修复技术是提高代码健壮性的最有效的方法之一. 程序员往 ...

  7. 逆向与破解-windows异常处理机制

    以前看到过的很棒的一个讲解SEH的,非常的详细和简单易懂,不需要特别纠结具体的结构和处理的方法,初期对过程有一定的掌握就可以.以下为原文 深入解析结构化异常处理(SEH) - by Matt Piet ...

  8. Linux学习之setjmp和longjmp函数

    nsetjmp和longjmp函数实现函数之间的跳转(需包含头文件"setjmp.h"): 函数原型:int setjmp(jmp_buf env);   void longjmp ...

  9. 【转】浅析C语言的非局部跳转:setjmp和longjmp

    转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...

最新文章

  1. chengxuyuan
  2. encoding python3_关于 Python3 的编码
  3. 数据库主备_数据库周刊40丨OceanBase官网上线开发者社区;人民日报关注易鲸捷;数据库迁移经验分享…...
  4. Dnsmasq原理总结
  5. c语言 链表_小陈的C语言笔记---链表(详细讲解基本操作和概念)
  6. ubuntu上安装python3.7教程_Ubuntu安装python 3. 7
  7. [c++]筛法求素数
  8. 使用Object、param标签在页面显示PDF文件
  9. STM32F091 can通信配置,can波特率计算方法
  10. CMM术语表详细说明
  11. matlab求两向量夹角_向量法解几何问题
  12. linux服务器ftp连接失败的原因,错误:无法与 SFTP 服务器建立 FTP 连接
  13. 任天堂残酷马里奥游戏
  14. 如何获得自己的外网IP?
  15. 各大cdn厂商的cname域名
  16. oracle insert汉字出错,oracle insert中文后,select是乱码
  17. java保存时间到数据库_java new date 保存到数据库时间不对
  18. Python基础教程之Python简介
  19. git fatal: schannel: next InitializeSecurityContext failed: SEC E CERT EXPIRED (0x80090328)
  20. 无力吐槽的 create-shortcut .exe

热门文章

  1. 嵌入式Linux中I2C设备驱动程序的研究与实现
  2. hdu 1506(dp || 单调栈)
  3. leetcode 10、Regular Expression Matching
  4. zoj-3802-Easy 2048 Again
  5. FZOJ 2014年11月份月赛 ytaaa(dp + RMQ)
  6. MYSQL免安装版-安装配置过程
  7. cocos creator基础-基本控件知识
  8. linux压缩与解压缩命令
  9. srping基础——DI(三)
  10. ubuntu 中 iptables 和 ufw 的关系