【发布时间】:2010-06-21 22:50:28
【问题描述】:
我正在尝试将 jmp_buf 定义为指针并在嵌套的 longjmp(s) 中使用它。如下:
...
jmp_buf *bfj;
...
然后写 if else:
if( setjmp(*bfj) == 0){
DS[SP-2].int_val=(int)bfj;;
//to store the bfj
}else {}
在其他地方使用存储的 bfj 到 longjmp
bfj = (jmp_buf *)DS[TOP].int_val;
longjmp(*bfj,1);
DS[TOP].int_val 是我存储它的位置。 似乎很清楚,我想使用存储的 bfj 进行嵌套 goto 和返回。 但是当我尝试调试时,我得到“未处理的异常”。我从一开始就明白了:
if( setjmp(*bfj) == 0)
如果有人能告诉我解决方案,我会很高兴。
【问题讨论】:
-
你have been told,你想做的不是一个好主意。如果你不听劝告,你还要求什么?
-
我知道使用 longjmps 不是一个好主意,但是当您尝试编写接近汇编语言的代码以输出编译器的语义阶段时,这是唯一的解决方案我的想法。所以对于我正在写的情况,这是方法,是的,这不是好方法。我必须生成接近汇编的代码,(三地址代码)。我从不将 goto 或 longjmp 用于常规程序,但在这种情况下,我必须生成这样的代码。这是编译器的本能。
-
不,这不是“编译器的天性”。编译器与任何其他程序没有什么不同:它所做的只是将某种输入转换为某种输出。您认为您需要使用
longjmp(并且您显然不了解它的作用或工作原理)这一事实表明您做错了非常错误。 -
我认为可以公平地估计两个最新的 Microsoft C++ 编译器之间的差异是 18 人年的努力!但 grayfade 是对的:即使是复杂的编译器也只是在转换数据结构。
-
我猜你没有看到“大学编译器课程”,你似乎也不知道什么是三地址码。