跨函数的代码能跳转吗?

kgblue 2007-05-28 12:12:03
goto语句只能在一个函数里面实行跳转,C语言中有没有语句可以实现跨函数之间的代码跳转的呢?
...全文
1023 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
mifeixq 2008-12-26
  • 打赏
  • 举报
回复
1L
setjmp longjmp
hai040 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 softwarewander 的回复:]
一直保持它的值唯一 还要用voliate?

ls所说的我知道, 就是在编译的时候,如果longjump之后有voliate变量的时候,还是需要将其进行编译。如果没有就可以理都不理。 但是怎么能保证“局部变量在longjmp过程中一直保持它的值唯一”
所以还是不理解。。。
[/Quote]
...
一直保持它的值,唯一可靠的方法
zenny_chen 2008-12-26
  • 打赏
  • 举报
回复
除了setjmp-longjmp外,内联汇编jump指令有时也是一种比较有效的方法。
shaoshaolong 2008-12-25
  • 打赏
  • 举报
回复
牛,这样的代码都被想了出来!不过倒可以用汇编来写,然后C语言调用之
过去的我 2008-12-25
  • 打赏
  • 举报
回复
顶.. 函数间跳来跳去堆栈肯定不平衡. 我咋在看c专家编程的时候没看到..
aqingzeng 2008-12-25
  • 打赏
  • 举报
回复
"一直保持它的值唯一 " 可能有点用词不当 :)
softwarewander 2007-05-29
  • 打赏
  • 举报
回复
一直保持它的值唯一 还要用voliate?

ls所说的我知道, 就是在编译的时候,如果longjump之后有voliate变量的时候,还是需要将其进行编译。如果没有就可以理都不理。 但是怎么能保证“局部变量在longjmp过程中一直保持它的值唯一”
所以还是不理解。。。

september_29 2007-05-28
  • 打赏
  • 举报
回复
setjump longjump
星羽 2007-05-28
  • 打赏
  • 举报
回复
可以

#include "setjmp.h"

jmp_buf jmpbuf;

void Funtion()
{
cout<<"hellp :)"<<endl;

longjmp(jmpbuf, 1);
}

int main()
{

if (setjmp(jmpbuf) == 0)
{
for (;;) Funtion();
}

cout<<"hi :)"<<endl;

system("pause");

return 1;

}
pnz_fox 2007-05-28
  • 打赏
  • 举报
回复
还是不要用goto,呵呵
rainstormed 2007-05-28
  • 打赏
  • 举报
回复
goto 可以实现任意跳转

但尽量不要用goto
pxxx123 2007-05-28
  • 打赏
  • 举报
回复
不行!
believefym 2007-05-28
  • 打赏
  • 举报
回复
不行

而且尽量少用goto
  • 打赏
  • 举报
回复
当然可以,跳转不当堆栈会错误的
fengdream 2007-05-28
  • 打赏
  • 举报
回复
as long as i can see, no.
ayw215 2007-05-28
  • 打赏
  • 举报
回复
volatile
通知编译器不优化代码

否则在编译的时候就可能会忽略掉longjmp后面的局部变量
softwarewander 2007-05-28
  • 打赏
  • 举报
回复
不明白这句话
************************************************************************
要保证局部变量在longjmp过程中一直保持它的值唯一可靠的方法是声名为volatile


麻烦ls大哥解释一下,
chenyu2202863 2007-05-28
  • 打赏
  • 举报
回复
在C专家编程里面可有提到setjmp和longjmp

setjmp(),longjmp()是通过操纵过程活动记录实现的。
* setjmp(jmp_buf j)必须首先被调用,表示“使用变量j记录的位置,函数返回零”
* longjmp(jmp_buf j,int i)可以接着被调用,表示“回到j所记录的位置 ,让它看上去像从原先的setjmp()函数返回一样,返回i,使代码能够知道它实际上是通过longjmp()返回的”。(很拗口)

* goto语句不能跳出C语言当前的函数(这也就是longjmp取名字的由来,它可以跳得更远,甚至跳到其他文件的函数中)
* longjmp只能跳回到曾经到过的地方,在执行setjmp的地方仍留下一个活动记录也就是“从何而来,往哪儿去”,longjmp接受一个额外的整形参数并返回他的值

#include <setjmp.h>

jmp_buf buf;

Banana()
{
printf("In Banana()\n");
longjmp(buf,1);
/*下面的代码不会执行
printf("You'll never see this ,because longjmp");
}

int main(void)
{
if( setjmp(buf) )
{
printf("Back in main\n");
}
else
{
printf("First time through\n");
Banana();
}

system("pause");
return 0;
}

输出结果:
First time through
in Banana
Back in main

要保证局部变量在longjmp过程中一直保持它的值唯一可靠的方法是声名为volatile

setjmp/longjmp最大的用途是错误恢复,只要没有从函数中返回,一旦发现一个不不可恢复的错误,就可以把控制转移到主输入循环,从新开始。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧