** 问 :goto语句只能在函数内使用,那如果想要在函数内部直接跳到函数外怎么办呢?**

** 答:setjmp跳转

  • 介绍:

  • 举例:

#include<stdio.h>
#include<setjmp.h>
jmp_buf envbuf; //保存进程的上下文 void b() {
printf("I am b function.\n");
longjmp(envbuf, 5); //回到setjmp的位置
} void a() {
printf("before call b, I am a\n");
b();
printf("after b finish, I am a\n");
} int main() {
int ret;
ret = setjmp(envbuf);
if (0 == ret) {
a();
}
return 0;
}

setjmp第一次调用返回值为0,进入if循环,调用a(),print出第一行,调用b,print第二行,再直接跳转到main函数ret的位置,此时ret置为5,再退出main函数。

setjmp的跳转的更多相关文章

  1. 短路运算|字符串操作函数|内存mem操作函数

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  2. 嵌入式系统C编程之错误处理【转】

    转自:http://www.cnblogs.com/clover-toeic/p/3919857.html 前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: ...

  3. 嵌入式系统C编程之错误处理

    前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: 一  错误概念 1.1 错误分类 从严重性而言,程序错误可分为致命性和非致命性两类.对于致命性错误,无法执行 ...

  4. Unix环境高级编程(五)进程环境

    本章主要介绍了Unix进程环境,包含main函数是如何被调用的,命令行参数如何传递,存储方式布局,分配存储空间,环境变量,进程终止方法,全局跳转longjmp和setjmp函数及进程的资源限制. ma ...

  5. c语言异常处理机制

    异常处理机制:setjmp()函数与longjmp()函数 C标准库提供两个特殊的函数:setjmp() 及 longjmp(),这两个函数是结构化异常的基础,正是利用这两个函数的特性来实现异常. 所 ...

  6. 【APUE】Chapter7 Process Environment

    这一章内容是Process的基础准备篇章.这一章的内容都是基于C Programm为例子. (一)进程开始: kernel → C start-up rountine → main function ...

  7. C语言中的异常处理机制

    #define try if(!setjmp(Jump_Buffer)) 返回try现场后重新执行判断,所以有两次执行. http://blog.csdn.net/tian_dao_chou_qin/ ...

  8. C语言程序设计:现代方法阅读笔记

    第二十六章 atexit函数允许用户“注册”在程序终止时要调用的函数:atexit(func); 在程序终止后,func函数会被自动调用 clock()函数可以计算程序运行时间 time函数返回当前的 ...

  9. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

随机推荐

  1. spring模拟ioc

    非spring 开发 public class UserService { private UserDao userDao=new UserDaoImpl(); public void addUser ...

  2. AtCoder Grand Contest 031 简要题解

    AtCoder Grand Contest 031 Atcoder A - Colorful Subsequence description 求\(s\)中本质不同子序列的个数模\(10^9+7\). ...

  3. 我的vim(持续更新)

    保存并退出:wq 退出但不保存修改:q! 不退出vi使用shell(bash)命令:!bash (如果想回到vi,bash下输入exit回车) 设置行号 :set nu 取消行号:set nonu 设 ...

  4. pushpin openresty 集成试用

    pushpin 是一个很不错的将restapi 转换为reailtime api 的proxy,openresty 具有很强的nginx 控制能力 可以方便的用来进行api 的开发,默认其他语言pus ...

  5. .NET本质论 用类型编程

    运行时的类型 类型本身并不是万能的.类型真正有意思的地方在于,程序员使用类型的实例,并让它们相互作用.类型的实例(instance)既可以是对象,也可以是值,这取决于类型如何定义的.基本数据类型(pr ...

  6. ThreadLocal使用注意

    ThreadLocal<T>的出现是一种空间换时间的思想的运用,是为了多线程环境下单线程内变量共享的问题.它的原理就是每个线程通过ThreadLocal.ThreadLocalMap,保存 ...

  7. wpf揭秘

    2.4属性元素 以下c#和xaml是一致的 Rectangle r = new Rectangle(); r.Width = 40; r.Height = 40; r.Fill = Brushes.B ...

  8. gaea-editor 知识点

    github 地址:https://github.com/ascoders/gaea-editor

  9. 运行Scrapy项目提示“import win32api ImportError: DLL load failed: 找不到指定的模块。”

    安装完成Scrapy时候,终端导入Scrapy时候,发现没有任何报错,但是在运行Scrapy的项目的时候提示“import win32api ImportError: DLL load failed: ...

  10. Linux下C与Mysql的混合编程(转)

    1 概述 MySQL 是一个关系型数据库管理系统.由瑞典MySQL AB公司开发,眼下属于Oracle公司.MySQL是最流行的关系型数据库管理系统. 支持AIX.FreeBSD.HP-UX.Linu ...