2025年3月28日 星期五 甲辰(龙)年 月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言goto,longjmp()和setjmp()之间有什么区别

时间:12-30来源:作者:点击数:114

goto语句实现程序执行中的近程跳转(local jump),longjmp()和setjmp()函数实现程序执行中的远程跳转(nonlocaljump,也叫farjump)。通常你应该避免任何形式的执行中跳转,因为在程序中使用goto语句或longjmp()函数不是一种好的编程习惯。

goto语句会跳过程序中的一段代码并转到一个预先指定的位置。为了使用goto语句,你要预先指定一个有标号的位置作为跳转位置,这个位置必须与goto语句在同一个函数内。在不同的函数之间是无法实现goto跳转的。

下面是一个使用goto语句的例子:

  • void bad_programmers_function(void)
  • {
  • int x
  • printf("Excuse me while I count to 5000... \n") ;
  • x----l~
  • while (1)
  • {
  • printf(" %d\n", x)
  • if (x ==5000)
  • goto all_done
  • else
  • x=x+1;
  • }
  • all_done:
  • prinft("Whew! That wasn't so bad, was it?\n");
  • }

如果不使用goto语句,是例可以编写得更好。下面就是一个改进了实现的例子:

  • void better_function (void)
  • {
  • int x
  • printf("Excuse me while I count to 5000... \n");
  • for (x=1; x<=5000, x++)
  • printf(" %d\n", x)
  • printf("Whew! That wasn't so bad, was it?\n") ;
  • }

前面已经提到,longjmp()和setjmp()函数实现程序执行中的远程跳转。当你在程序中调用setjmp()时,程序当前状态将被保存到一个jmp_buf类型的结构中。

此后,你可以通过调用longjmp()函数恢复到调用setjmp()时的程序状态。与goto语句不同,longjmp()和setjmp()函数实现的跳转不一定在同一个函数内。然而,使用这两个函数有一个很大的缺陷,当程序恢复到它原来所保存的状态时,它将失去对所有在longjmp()和setjmp()之间动态分配的内存的控制,也就是说这将浪费所有在longjmp()和setjmp()之间用malloc()和calloc()分配所得的内存,从而使程序的效率大大降低。

因此,你应该尽量避免使用longjmp()和setjmp()函数,它们和goto语句一样,都是不良编程习惯的表现。

下面是使用longjmp()函数和setjmp()函数的一个例子:

  • #include <stdio.h>
  • #include <setjmp.h>
  • jmp_buf saved_state;
  • void main(void);
  • void call_ longjmp (void);
  • void main(void)
  • {
  • int ret_code;
  • printf("The current state of the program is being saved... \n");
  • ret_code = setjmp (saved_state)
  • if (ret_code ==1)
  • {
  • printf("The longjmp function has been called. \n" )
  • printf("The program's previous state has been restored. \n");
  • exit(0)
  • }
  • printf("I am about to call longjmp and\n");
  • printf('return to the previous program state... \n" )
  • call_ longjmp ( )
  • }
  • void call_longjmp (void)
  • {
  • longjmp (saved_state, 1 )
  • }

 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门