setjmp用法

原创 2011年01月20日 21:52:00

 

Setjmp.h 所做的事情就是异常处理,抛出异常,捕获异常,异常处理。来看一个简单的例子,除法中除数不能为0。

 

 19 #include <stdio.h>

 20 #include <setjmp.h>

 21 

 22 jmp_buf zero_jmp_buf;

 23 

 24 double division(int a, int b)

 25 {

 26     double result=0.0;

 27     printf("Execute %d/%d .../n", a, b );

 28     if(0 == b)

 29     {

 30         printf("b==0, throw exception /n");

 31         longjmp(zero_jmp_buf, 1);

 32         printf("and here never execute/n");

 33     }

 34 

 35     result=a/b;

 36     printf("The result is %.2f/n", result );

 37     return result;

 38 }

 39 

 40 int main(int argc, char const* argv[])

 41 {

 42     if (0==setjmp(zero_jmp_buf)) {

 43         printf("execute program as normal /n");

 44         division(10,5);

 45         division(10,0);

 46         division(10,8);

 47     }

 48     else 

 49     {

 50         printf("catch a exception, the b is zero /n");

 51     }

 52     return 0;

 53 }

编译和运行 gcc mysetjmp.c

wu@wu-A8Sc:~/workspace/tt2$ ./a.out 

execute program as normal 

Execute 10/5 ...

The result is 2.00

Execute 10/0 ...

b==0, throw exception 

catch a exception, the b is zero 

在22行定义了一个jmp_buf 的全局变量zero_jmp_buf ,他的作用就相对于定义了一个外部标号的集合。函数 division的作用就是除法操作。42     if (0==setjmp(zero_jmp_buf)) 相当于try,第一次运行时setjmp(zero_jmp_buf)始终等于0. 跟它相匹配的else相当于catch, longjmp(zero_jmp_buf, 1);相当于throw , 这样就和c++中的异常处理相对应了。在这里可以用switch.. case..结构来替代if...else ,这样就可以适用于多种情况。例如

switch(setjmp(zero_jmp_buf))

{

 case 0:

//正常运行情况,相对于try

break;

case 1:

//catch,当调用longjmp(zero_jmp_buf, 1);时运行此处代码

break;

case 2:

//catch,当调用longjmp(zero_jmp_buf, 2);时运行此处代码

break;

}

 

case 后的值跟longjmp第二个参数是相对应的。C语言还是很强大的,C ++可以做到的它基本上也可以...

 

C中setjmp和longjmp用法

C中提供了goto语法,可以通过goto跳转到函数体内部标记的某一行代码,但是却无法跳出函数之外的任意位置。 为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局...
  • oktears
  • oktears
  • 2015年01月28日 16:32
  • 1719

探秘C函数栈帧---实现自己的setjmp/longjmp

前言 最近再看《C标准库》看到了setjmp和longjmp函数这里,所以就打算好好学习下C的函数栈帧。 __start 在标准C库中,它是通过汇编语言完成的,但是我们这里为了研究原理,所以用C 语言...
  • zmrlinux
  • zmrlinux
  • 2015年11月18日 22:18
  • 383

linux系统中的setjmp()和longjmp()函数

1. 作用: setjmp()和longjmp() 可以实现非局部控制转移即从一个函数到另外一个函数的跳转。 2. 函数原型: #include int setjmp(jmp_buf env); v...
  • c1194758555
  • c1194758555
  • 2016年10月10日 18:26
  • 1019

setjmp, longjmp用法简介

setjmp和longjmp其实就是goto的升级版,goto只能在同一个函数中跳转,但是setjmp和longjmp可以实现在不同的函数之间跳转。 下面是一个简单的示例演示,代码+运行结果,几行注...
  • wzzfeitian
  • wzzfeitian
  • 2013年07月14日 16:51
  • 2663

C语言异常处理机制--setjmp的返回值

使用setjmp时必须使用头文件setjmp.h。#include "setjmp.h"jmp_buf jmpbuffer;   int setjmp(jmp_buf jmpbuffer); void...
  • wesleyluo
  • wesleyluo
  • 2010年03月03日 10:44
  • 1945

C语言中利用setjmp和longjmp做异常处理

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制。异常处理就是其中的一种错误处理方式。1 过程活动记录(Active Record)C语言中每当有一个函数调用...
  • smstong
  • smstong
  • 2016年02月24日 14:55
  • 2703

setjmp与longjmp原理分析

一、setjmp与longjmp的用法参考下面的文章         http://blog.csdn.net/chenyiming_1990/article/details/8683413 二、s...
  • stillvxx
  • stillvxx
  • 2014年01月08日 11:43
  • 1597

setjmp与sigsetjmp的区别

setjmp与sigsetjmp的区别setjmp与sigsetjmp的作用我就不多描述了,这篇博文只是我的一个随笔,希望想弄清楚这2个函数的区别的童鞋做一个参考,后面我会附带一个例子详细说明一下,s...
  • sinat_16133021
  • sinat_16133021
  • 2017年04月21日 12:44
  • 302

C语言之setjmp和longjmp详细剖析

我希望看这篇文章的你对C++的传统异常处理,即try...catch...throw有了解(不是Windows SEH),这样才能方便你最深入的理解这2个C语言的反人类函数。 当然如果不了解就先看下...
  • a1875566250
  • a1875566250
  • 2014年10月20日 11:23
  • 2408

setjmp用法

原文地址 http://blog.csdn.net/wuhong40/article/details/6155838 Setjmp.h 所做的事情就是异常处理,抛出异常,捕获异常,异常...
  • buzaikoulan
  • buzaikoulan
  • 2015年03月28日 09:01
  • 214
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:setjmp用法
举报原因:
原因补充:

(最多只允许输入30个字)