我们知道goto语句是不能跳过函数的,但是在我么C语言的应用中,在不使用汇编的情况下,遇到需要跳出深层循环比如检错机制的时候,有确实想要跨函数跳转,有没有上面办法可以做到呢?

这就是今天要讲的两个库函数,setjmp和longjmp.

先看例子:

#include<stdio.h>
#include<setjmp.h>
void test(void);
jmp_buf restart;
int main(void)
{
int num, value; int i = ;
value = setjmp(restart);//不管调用多少次,value都为0(只要没调用longjmp函数)
while (value == )
{ i++;
printf("test success\n");
if (i > )
{
i = ;
value = ;
}
}
while ()
{
printf("输入数字 1 打印right,输入数字 2 ,模拟错误信息,观察打印信息\n");
scanf("%d", &num);
switch (num)
{
case :printf("right\n"); num = ; break;
case :printf("err\n"); num = ; test(); break; } } return ;
}
void test(void)
{
int num;
printf("输入数字 1 测试跳转\n");
scanf("%d", &num);
if (num == )
longjmp(restart, );
}

通过上面的测试代码和输出数据,我们可以看到longjmp跳转实现了跨函数,而goto语句是做不到的.

更多细节待续。。。

goto语句的升级版,setjmp,longjmp的更多相关文章

  1. setjmp/longjmp 使用

    C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大).另外,C语言标准中还提供一种非局部跳转“n ...

  2. setjmp/longjmp

    1.setjmp/longjmp属于传统的错误处理 2.setjmp/longjmp是对goto语句的补充,goto仅仅能实现局部跳转.setjmp/longjmp能够实现全局跳转 3.setjmp/ ...

  3. 通过goto语句学习if...else、switch语句并简单优化

    goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同 ...

  4. goto语句 switch语句

    goto语句 #include <iostream> using namespace std; int main() { int i = 1; number: i++; std::cout ...

  5. Linux setjmp longjmp

    /********************************************************************* * Linux setjmp longjmp * 说明: ...

  6. 函数 setjmp, longjmp, sigsetjmp, siglongjmp

    一,相关函数接口 1,setjmp,longjmp,sigsetjmp,siglongjmp   #include <setjmp.h> int setjmp(jmp_buf env); ...

  7. 在程序中,你敢怎样使用“goto”语句!

    用goto是一个个人爱好的问题.“我”的意见是,十个goto中有九个可以用相应的结构化结构来替换.在那些简单情形下,你可以完全替换掉goto,在复杂的情况下,十个中也有九个可以不用:你可以把部分代码写 ...

  8. 布尔逻辑运算,goto语句

    布尔逻辑 bool类型可以有两个值:true或者false. 布尔比较需要使用布尔比较运算符(关系运算符),下图:var1为布尔类型的变量,var2,var3则可以是不同类型.

  9. Go 语言 goto 语句

    Go 语言的 goto 语句可以无条件地转移到过程中指定的行. goto语句通常与条件语句配合使用.可用来实现条件转移, 构成循环,跳出循环体等功能. 但是,在结构化程序设计中一般不主张使用goto语 ...

随机推荐

  1. 老男孩linux实训学生入学资格考试题(技术部分)

    ################################################################ 本文内容摘录于老男孩linux实战运维培训中心入学考试题(答案部分) ...

  2. Magento模型与ORM基础

    参考网址:http://www.ruiwant.com/magento-for-dev-part-5-magento-models-and-orm-basics.html

  3. Swift 基础知识

    前言 Swift 是一门强类型语言,全面支持 Unicode 编码. Swift 中的定义和实现是在同一个单元中的,通常一个 Swift 源代码单文件是以 .swift 结尾的. Swift 不需要单 ...

  4. dbms_random.seed

    语法: DBMS_RANDOM.SEED ( val IN BINARY_INTEGER); DBMS_RANDOM.SEED ( val IN VARCHAR2); val: Seed number ...

  5. 全面拥抱移动测试,Mobile JSON Wire Protocol Specification文档翻译

    Selenium3已经宣布不支持移动化测试.对于老牌测试工具selenium来说这是以退为进,因为移动自动化测试工具的标准还在selenium团队手上. 本文轻度翻译了这个标准,看得懂的人不用翻译也能 ...

  6. pascalVOC 标注文件,解析为TXT

    首先,读取所有xml文件完整路径,写入train.txt 文本文档中, 然后读取TXT文档,逐行读取xml文档,建文件夹,用于保存解析好的TXT,写入TXT时,只需要保存类别名和坐标信息即可,中间用T ...

  7. There is no Action mapped for namespace / and action name . - [unknown location]

    今天碰到了这个问题,原因不明白. 在webContent下建立了index.jsp后重启项目不报错了. 原因未知.

  8. 闭包(Closures)

    本文转自:http://goddyzhao.tumblr.com/post/11311499651/closures 翻译自:http://dmitrysoshnikov.com/ 概要 本文将介绍一 ...

  9. talend hive数据导入到mysql中

    thiveInput->tmap->tMysqloutput thiveInput: tmap: tmysqlOutput:注意编码问题:noDatetimeStringSync=true ...

  10. 实现session(session数据)的共享,解决分布式session共享

    为什么要实现共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话 ...