`

No local goto--longjmp and setjmp

阅读更多

c语言提供了两个函数可以用来非local的跳转:

#include <setjmp.h>

int setjmp(jmp_buf envbuf );
void longjmp(jmp_buf env, int val); 

setjmp保存当前的系统堆栈到envbuf中,第一次调用返回0,以后当我们调用longjmp

时返回longjmp设置的val,但是不可以返回0(val设置为0,返回1).

longjmp恢复前线程最近一次调用setjmp保存的环境,回到该setjmp处继续执行。

例子:

#include <setjmp.h>
#include <stdio.h>

jmp_buf ebuf;
void f(void);

int main(void){
	int i;
	printf("1");
	i = setjmp(ebuf);
	if(i == 0){
		f();
		printf("This will not be printed.");
	}
	printf("%d",i);
	return 0;
}

void f(void){
	printf("2");
	longjmp(ebuf,3);
}

 结果输出:123

0
1
分享到:
评论

相关推荐

    c标准异常处理-全面了解setjmp与longjmp的使用[参照].pdf

    在C语言中,setjmp和longjmp是一对用于异常处理和非局部跳转的函数,它们提供了在程序中实现类似于异常处理的机制。虽然C++有自己的异常处理框架,但setjmp和longjmp在某些特定场景下依然有其独特价值。 首先,...

    setjmp和longjmp详细介绍

    虽然`setjmp`和`longjmp`的功能类似于`goto`语句,但它们之间存在显著差异: - **作用范围**:`goto`只能在同一函数内部进行跳转;而`setjmp`和`longjmp`可以在不同函数之间进行跳转。 - **复杂度管理**:`setjmp`和...

    setjump与longjmp(异常处理机制)

    它们提供了一种非本地局部跳转("non-local goto")机制,能够在程序中实现错误处理模块的调用和返回。 setjmp 函数的作用是保存程序当前的堆栈环境,通过将当前的堆栈环境保存到 env 参数中,以便在将来恢复程序的...

    浅析C语言中的setjmp与longjmp函数

    `setjmp` 和 `longjmp` 的主要用途是在错误处理中,它们可以替代 `goto` 语句,但比 `goto` 更强大,因为 `goto` 只能在同一函数内跳转,而 `setjmp` 和 `longjmp` 能够跨越函数边界进行跳转。这种机制使得程序员...

    goto-line-preview:执行`goto-line`命令时的预览行

    用法直接从minibuffer调用它, M-x goto-line-preview或者,您可以将其全局绑定以替换goto-line : ( global-set-key [remap goto-line] 'goto-line-preview )贡献如果您想为该项目做出贡献,则可以克隆并向该存储库...

    C语言中的异常处理:使用goto和setjmp,longjm

    尽管C语言没有内建的异常处理机制,但通过setjmp/longjmp和goto语句,我们仍然可以实现类似异常处理的功能。这些技术在处理错误和异常情况时非常有用,但需要谨慎使用,以保持代码的清晰和可维护性。通过合理地应用...

    Atom-atom-goto-definition,不赞成的对FaceAir/Atom的贡献.zip

    "Atom-atom-goto-definition.zip" 提到的是一个与Atom相关的插件或功能,名为“Atom Goto Definition”,它允许用户快速跳转到代码中的定义位置,极大地提高了编程效率。 在编程环境中,"Goto Definition" 或 "Go ...

    The C programming Language(chm格式完整版)

    The C programming Language ...Non-local Jumps: &lt;setjmp.h&gt; Signals: &lt;signal.h&gt; Date and Time Functions: &lt;time.h&gt; Implementation-defined Limits: &lt;limits.h&gt; and &lt;float.h&gt; Appendix C: Summary of Changes

    goto-project-rs:在Shell中轻松快速地进行项目切换!

    `goto-project-rs` 是一个用 Rust 编写的命令行工具,专为开发者设计,旨在简化在多个项目之间切换的过程。在日常开发工作中,我们往往需要频繁地在不同的项目目录间跳转,手动操作可能会浪费不少时间。`goto-...

    GOTO-20-开源

    【GOTO-20-开源】是一个专注于Java字节码编译器的项目,它是basicode-2的进一步发展和改进。在这个项目中,我们主要关注的是如何优化和提升Java程序的性能,尤其是在运行时环境下的表现。开源软件的性质意味着它的源...

    GOTO-crx插件

    **GOTO-crx插件详解** GOTO-crx是一款针对英语用户设计的浏览器插件,其主要功能是方便用户快速浏览他们最常访问的网站。这款插件通过提供一种高效的方式来管理和访问网络地址,极大地提升了用户的上网体验。下面将...

    Goto-X:Web 浏览器的扩展,扩展了一键转到非链接 URL 选择的功能

    标题中的“Goto-X”是一款针对Web浏览器的扩展程序,主要功能是增加了用户可以一键访问非链接URL的能力。这意味着用户无需手动输入完整的网址,只需提供部分URL或网站名称,Goto-X就能帮助他们快速导航到目标网站。...

    python-goto:一个函数修饰器,重写字节码,以在Python中启用goto

    安装pip install goto-statement用法from goto import with_goto@ with_gotodef range ( start , stop ): i = start result = [] label . begin if i == stop : goto . end result . append ( i ) i += 1 goto . ...

    implementing-goto-continuations:JavaScript中“ goto”的选项

    ./2-goto-via-command-stack.js const s = useContinuation ( ) const { setGoto , setStop , state , push } = s . next ( [ false , false ] ) . value push ( "state.a = 3" ) s . next ( [ true , false ] ) /...

    occam一维反演

    c 4) there are no irrecoverable convergence problems c if (konv .ne. 0) then write (iof1,*) ' Convergence problems of type ', konv close(iof1) stop else if (nit .ge. itmax) then write (iof1,*) '...

    py-goto-project:在shell中轻松快速地进行项目切换!

    pip3 install goto-project --user # or pip if python3 is your default interpreter 您可以使用安装zsh完成 antigen bundle sivakov512/goto-project completions/zsh 现在输入gt ,然后按,您将看到所有可用的...

    goto-build:当go原始码更改时,自动编译并运行!

    "goto-build"是一个针对Go语言开发的自动化工具,它的主要功能是在Go源代码发生更改时自动进行编译并运行程序,极大地提高了开发效率。在快速迭代和调试过程中,这种实时编译和运行的能力是非常有用的,它能帮助...

    1-0-READ-AND-WRITE.zip_vb 二进制文件_vb 二进制读写

    在"1-0-READ-AND-WRITE.zip_vb 二进制文件_vb 二进制读写"这个压缩包中,包含了一个关于VB二进制文件读写的示例。这个示例可能包括如何打开一个二进制文件,读取其内容,然后进行可能的修改,最后将修改后的数据写回...

    对Python3 goto 语句的使用方法详解

    然而,有一些第三方库,如`goto-statement`,允许开发者模拟实现类似于C语言中的goto功能。下面将详细介绍如何在Python3中使用这个库以及相关的注意事项。 首先,为了使用`goto`功能,你需要通过`pip`安装`goto-...

    goto-react:VSCode扩展

    Extension for React项目可以打开当前打开的组件的... 运行命令goto-react: Open component/container 。 贡献 如果发现错误,请创建或 。 学分 用来演示用法的代码是一个来自 repo的。 执照 :copyright: rodrigobdz 。

Global site tag (gtag.js) - Google Analytics