c语言 goto 和 longjmp 的区别

来源:互联网 发布:华泰证券交易软件 编辑:程序博客网 时间:2024/05/29 15:22

c语言 goto 和 longjmp  基本用法 与 区别

C语言的goto 和 longjmp 都可以跳出正常的控制流。但 goto 只能在 函数内 使用。

一.goto 基本用法,
1.标识符+ ":"  标记 这一行可以使用 goto, 例如:底下例子: test:if (i == 10)
2.goto 标识符;          底下例子:goto test;

上代码解释:

void testGoto(){test2:printf("print test2");}int _tmain(int argc, _TCHAR* argv[]){int i = 10;test:if (i == 10){printf("i == 10\n");i = 20;goto test;}else if(i == 20){printf("i == 20");}}

输出结果是:


如果将 
goto test; 改成 goto test2; 编译都过去。 可想 goto 只能 返回 函数内 的 语句。

二:longjmp 用法
这个 涉及到 C标准库 的 setjmp 库。
这个库很简单 就 三个东西
jmp_buf 类型: 保存 上下文 执行环境的 变量
setjmp :  设置 jmp_buf 变量的 函数
longjmp : 返回 jmp_buf 变量 的 位置

#include <csetjmp>static jmp_buf errorGoto;void testsetJmp(int a,int b){if (b == 0){printf("error\n");longjmp(errorGoto,1);}}int _tmain(int argc, _TCHAR* argv[]){switch (setjmp(errorGoto)){case 0:printf("first run\n");testsetJmp(10,0);break;case 1:printf("next run");testsetJmp(10,20);break;case 2:printf("333333333333");default:break;}}

需要说明的是 
1.setjmp 函数的 返回值: 第一次执行的时候返回的是0,以后执行 都返回 longjmp 调用的 第二个参数的值,如果longjmp 第二个参数的值为0,则返回1.
2.setjmp 有一些使用限制。
下图摘自:《C标准库》




0 0