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");
}
}
输出结果是:
:
如果将
二:longjmp 用法
goto test; 改成 goto test2; 编译都过去。 可想 goto 只能 返回 函数内 的 语句。
这个 涉及到 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标准库》