大龙的博客
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2012年8月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
留言簿
(43)
给我留言
查看公开留言
查看私人留言
收藏夹
ps
(rss)
随笔档案
2014年10月 (1)
2014年8月 (4)
2014年6月 (1)
2013年12月 (6)
2013年11月 (2)
2013年10月 (5)
2013年9月 (4)
2013年7月 (1)
2013年6月 (2)
2013年3月 (1)
2013年2月 (20)
2013年1月 (10)
2012年12月 (8)
2012年11月 (5)
2012年10月 (9)
2012年9月 (4)
2012年8月 (16)
2012年7月 (8)
2012年6月 (10)
2012年5月 (11)
2012年4月 (3)
2012年3月 (10)
2012年2月 (6)
2012年1月 (4)
2011年12月 (6)
2011年11月 (16)
2011年10月 (32)
2011年9月 (13)
2011年8月 (6)
2011年7月 (27)
2011年6月 (18)
2011年5月 (12)
2011年4月 (2)
2011年3月 (1)
2011年2月 (5)
2011年1月 (24)
2010年12月 (5)
2010年11月 (2)
2010年10月 (3)
2010年9月 (4)
2010年8月 (7)
2010年6月 (13)
2010年5月 (18)
2010年4月 (21)
2010年3月 (6)
2010年2月 (7)
2010年1月 (7)
2009年12月 (7)
2009年11月 (2)
2009年10月 (8)
2009年9月 (19)
2009年8月 (11)
2009年6月 (28)
2009年5月 (35)
2009年4月 (18)
2009年3月 (24)
2009年2月 (13)
2009年1月 (10)
2008年12月 (2)
2008年11月 (6)
2008年10月 (4)
2008年9月 (11)
2008年8月 (18)
2008年7月 (8)
2008年6月 (19)
2008年5月 (9)
2008年4月 (6)
2008年3月 (2)
2008年2月 (4)
2008年1月 (21)
2007年12月 (14)
2007年11月 (4)
2007年10月 (7)
2007年9月 (17)
2007年8月 (10)
2007年7月 (20)
2007年6月 (11)
2007年5月 (8)
2007年4月 (13)
2007年3月 (2)
2007年2月 (6)
2007年1月 (14)
2006年12月 (23)
2006年11月 (15)
2006年10月 (5)
2006年9月 (4)
文章档案
2007年11月 (1)
2006年12月 (1)
阅读排行榜
1. LinuxShell算术运算(49302)
2. Windows XP DDK 的有效下载地址(45101)
3. WinDBG教程(40925)
4. Android 打包签名 从生成keystore到完成签名 -- 转(40652)
5. 在Cygwin上安装编辑器vim (38989)
评论排行榜
1. Windows XP DDK 的有效下载地址(116)
2. 在Cygwin上安装编辑器vim (24)
3. (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议 ---------- 转(14)
4. Compuware DriverStudio V3.2(10)
5. 经典好书 (10)
常用链接
我的随笔
我的评论
我参与的随笔
统计
随笔 - 864
文章 - 2
评论 - 378
引用 - 0
最新评论
1. re: 安装Nexus私服
谢谢博主。我刚学搭建nexus,挺不错的。
--做有为青年
2. re: 用slf4j+logback实现多功能日志解决方案 --- 转
谢谢楼主,整个流程非常清楚,照着做了一遍就会了。另外我分享一个logback目前尚存在的bug:当你发现INFO级和ERROR级的日志没有写成功时,上下移动一下配置文件中appender的位置就好了。
--welldone
3. re: LinuxShell算术运算
你这些都验证过吗
--是是是
4. re: 用slf4j+logback实现多功能日志解决方案 --- 转
写的非常好!
--Hello
5. re: (TCP-over-UDP library):基于UDP协议之上实现通用、可靠、高效的TCP协议 ---------- 转
评论内容较长,点击标题查看
--pcplayer
setjmp
与刺激的abort()和exit()相比,goto语句看起来是处理异常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。
为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件<setjmp.h>申明了这些函数及同时所需的jmp_buf数据类型。
原理非常简单:
1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)
通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用setjmp()标记相应的异常处理程序。
#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{
printf("exception raised\n");
longjmp(j, 1); /* jump to exception handler */
printf("this line should never appear\n");
}
int main(void)
{
if(setjmp(j) == 0)
{
printf("''setjmp'' is initializing ''j''\n");
raise_exception();
printf("this line should never appear\n");
}
else
{
printf("''setjmp'' was just jumped into\n");
/* this code is the exception handler */
}
return 0;
}
/* When run yields:
''setjmp'' is initializing ''j''
exception raised
''setjmp'' was just jumped into
*/
那个填充jmp_buf的函数不在调用longjmp()之前返回。否则,存储在jmp_buf中的上下文就有问题了:
jmp_buf j;
void f(void)
{
setjmp(j);
}
int main(void)
{
f();
longjmp(j, 1); /* logic error */
return 0;
}
所以,你必须把setjmp()处理成只是到其所在位置的一个非局部跳转。
Longjmp()和setjmp()联合体运行于异常生命期的2和3阶段。longjmp(j,r)产生异常对象r(一个整数),并且作为返回值传送到setjmp(j)处。实际上,setjmp()函数通报了异常r。
下面这个例子采用switch,能更好的展现这对函数的功能:
#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{
printf("exception raised\n");
longjmp(j, 3); /* jump to exception handler case 3 */
printf("this line should never appear\n");
}
int main(void)
{
switch (setjmp(j))
{
case 0:
printf("''setjmp'' is initializing ''j''\n");
raise_exception();
printf("this line should never appear\n");
case 1:
printf("Case 1\n");break;
case 2:
printf("Case 2\n");break;
case 3:
printf("Case 3\n");break;
default:
break;
}
return 0;
}
posted on 2010-12-31 10:45
大龙
阅读(269)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 大龙