[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非局部跳转函数的使用的更多相关文章

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

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

  2. Unix系统编程()执行非局部跳转:setjmp和longjmp

    使用库函数setjmp和longjmp可执行非局部跳转(local goto). 术语"非局部(nonlocal)"是指跳转目标为当前执行函数之外的某个位置. C语言里面有个&qu ...

  3. 二十、Linux 进程与信号---非局部跳转

    20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...

  4. (C)非局部跳转语句(setjmp和longjmp)

    1. 特点 非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句. 头文件包含#include Void longjmp(jmp_buf env,int val ...

  5. C语言中setjmp与longjmp学习笔记

    C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

  6. 【转载】setjmp和longjmp函数使用详解

    [说明]本文上半部分转载自 wykwdy007 的转载文章 http://blog.csdn.net/wykwdy007/article/details/6535322 --------------- ...

  7. 进程环境之setjmp和longjmp函数

    在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...

  8. setjmp和longjmp函数使用详解

    源地址:http://blog.csdn.net/zhuanshenweiliu/article/details/41961975 非局部跳转语句---setjmp和longjmp函数.非局部指的是, ...

  9. setjmp和longjmp函数

    关于setjmp函数和longjmp函数有话要说,是UNIX高级环境变成看到了10.10信号那章用到了,研究一下,这里作为补充. setjmp(jmp_buf env_buf) 函数可以将当前的运行环 ...

随机推荐

  1. xpath & <tr><td><br>

    python : 3.6 lxml : 4.2.1 from lxml.html import etree test_html = ''' <!DOCTYPE html PUBLIC " ...

  2. ADO.NET 连接池 Session 状态分析

    ADO.NET 中提供连接池避免 在业务操作中频繁打开,关闭连接. 当客户端释放连接后,连接池并未真正将数据库连接资源释放 , 而是根据连接字符串特征,将资源放到连接池中, 方便下次重用. 因此问题来 ...

  3. Cracking The Coding Interview 5.7

    //An array A[1-n] contains all the integers from 0 to n except for one number which is missing. In t ...

  4. Cracking The Coding Interview3.3

    //Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in re ...

  5. SQL-12 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary

    题目描述 获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salaryCREATE TABLE `dept_emp` (`emp_no` int(11) NOT ...

  6. 7系列FPGA远程更新方案-QuickBoot(转)

    reference: http://xilinx.eetrend.com/d6-xilinx/article/2014-04/7009.html reference :  quickboot meth ...

  7. tensorflow-优化器

    优化器可以通俗的理解成梯度下降那一套流程. 梯度下降 基本流程 a. 损失函数 b. 求导,计算梯度 c. 更新参数 d. 迭代下一批样本 可以对照着理解tf. tf 优化器 正常使用流程 a. 创建 ...

  8. VOOKI:一款免费的Web应用漏洞扫描工具

    Vooki是一款免费且用户界面友好的Web应用漏扫工具,它可以轻松地为你扫描任何Web应用并查找漏洞.Vooki主要包括三个部分,Web应用扫描器,Rest API扫描器以及报告.Web应用扫描器​V ...

  9. Android:如何获取屏幕的宽高

    WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMet ...

  10. C代码与C++代码之间的相互调用

    1.showCpp.cpp #include <iostream> using namespace std; // 声明为C语言可以调用的函数 extern "C" v ...