setjmp与longjmp非局部跳转函数的使用
[root@bogon code]# cat c.c
#include<stdio.h>
#include<setjmp.h>
static jmp_buf env;//定义全局变量env
void job()
{
longjmp(env,2);//会返回到setjmp(env)处,且返回值为2
}
void work(int argc)
{
if(argc==1)//没有参数
longjmp(env,1);//返回到setjmp(env)处,返回值为1
job();//有参数调用job()
}
int main(int argc,char *argv[])
{
switch(setjmp(env))//setjmp(env)初始值为0
{
case 0:
work(argc);//传参数个数过去,argc为1代表没有参数
break;
case 1:
printf("this is from no parameter work()\n");//不带程序参数的输出
break;
case 2:
printf("this is from have parameter job()\n");//带程序参数的输出
break;
}
return 0;
}
[root@bogon code]# gcc c.c
[root@bogon code]# ./a.out
this is from no parameter work()
[root@bogon code]# ./a.out 32
this is from have parameter job()
[root@bogon code]#
现在我们来看一下优化编译器问题
[root@bogon code]# cat c.c
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h>
static jmp_buf env;
void work(int a,int b,int c)
{
longjmp(env,1);
}
int main(int argc,char *argv[])
{
int a;
register int b;
volatile int c;//将变量声明为volatile,那么编译优化时,该变量的值(300)不会在调用longjmp函数后,重置为setjmp函数调用前的值(30),而其他类型的变量都会重置
a=10;
b=20;
c=30;
if(setjmp(env)==0)
{
a=100;
b=200;
c=300;
work(a,b,c);
}
else
printf("a is %d\nb is %d\nc is %d\n",a,b,c);
return 0;
}
[root@bogon code]# gcc c.c//没有进行编译优化,所以都没有重置
[root@bogon code]# ./a.out
a is 100
b is 200
c is 300
[root@bogon code]# gcc -O c.c//使用选项-O进行编译优化,所以有重置
[root@bogon code]# ./a.out
a is 10
b is 20
c is 300
[root@bogon code]#
为了使程序便于维护,还是应当尽量避免使用setjmp和longjmp,不过有时候在恰当的地方,其用处还是很大的,另外我们还应该限制使用goto一样
setjmp与longjmp非局部跳转函数的使用的更多相关文章
- 【转】浅析C语言的非局部跳转:setjmp和longjmp
转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...
- Unix系统编程()执行非局部跳转:setjmp和longjmp
使用库函数setjmp和longjmp可执行非局部跳转(local goto). 术语"非局部(nonlocal)"是指跳转目标为当前执行函数之外的某个位置. C语言里面有个&qu ...
- 二十、Linux 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...
- (C)非局部跳转语句(setjmp和longjmp)
1. 特点 非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句. 头文件包含#include Void longjmp(jmp_buf env,int val ...
- C语言中setjmp与longjmp学习笔记
C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型: int setjmp(jmp_buf envbuf) ,然而longjm ...
- 【转载】setjmp和longjmp函数使用详解
[说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...
- 进程环境之setjmp和longjmp函数
在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...
- setjmp和longjmp函数使用详解
源地址:http://blog.csdn.net/zhuanshenweiliu/article/details/41961975 非局部跳转语句---setjmp和longjmp函数.非局部指的是, ...
- setjmp和longjmp函数
关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充. setjmp(jmp_buf env_buf) 函数可以将当前的运行环 ...
随机推荐
- 深入研究sqlalchemy连接池
简介: 相对于最新的MySQL5.6,MariaDB在性能.功能.管理.NoSQL扩展方面包含了更丰富的特性.比如微秒的支持.线程池.子查询优化.组提交.进度报告等. 本文就主要探索MariaDB当中 ...
- eclipse package视图和navigator视图的区别
package视图是适合开发的视图,因为开发时我们只关注源文件,并不关注编译后的二进制文,所有在该视图中存放二进制文件的classes文件被隐藏了,而navigator视图,就是项目在工作空间中存放的 ...
- mysql数据库存储引擎及区别
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...
- 愛與痛的邊緣--IPA--粤语
谭咏麟和王菲的版本各有味道.
- APC注入(Ring3)
首先简单介绍一下APC队列和Alertable. 看看MSDN上的一段介绍(https://msdn.microsoft.com/en-us/library/ms810047.aspx): The s ...
- 用matlab绘制中国地图
reference:https://jingyan.baidu.com/article/870c6fc36fdacfb03ee4be58.html shp: http://muchong.com/ht ...
- Oracle特殊字符转义:&和'
Oracle特殊字符转义:&和' 我们在SQL*PLUS下执行 SQL show all命令时,可以发现一个参数:define & (hex 26),如下所示 concat . ...
- L317 电子烟
Why it’s so hard to talk about e-cigarette risks A growing proportion of American adults consider va ...
- react 学习笔记 npm 命令
第一步: cnpm install --save react react-dom babelify babel-preset-react 第二步: 安装es2015 cnpm install babe ...
- python第二天 python介绍与变量
编程语言的分类: 分别为 机器语言,汇编语言,高级语言 所以按照翻译方式又被分为两种 编译型:在代码执行时,需要先进行编译成二进制文件之后,才能够被执行 代表如:c语言,执行速度快,但是调试麻烦 解释 ...