【问题标题】:stating jmp_buf as pointer将 jmp_buf 声明为指针
【发布时间】: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 是对的:即使是复杂的编译器也只是在转换数据结构。
  • 我猜你没有看到“大学编译器课程”,你似乎也不知道什么是三地址码。

标签: c++ setjmp


【解决方案1】:

从您的代码中,您实际上并没有为您的jmp_buf 分配内存。您可以做以下几件事:

  1. new动态分配你的jmp_buf,当你完成它时你会想要delete
  2. jmp_buf 放入堆栈jmp_buf bfj;,当你想要它的指针时,你可以用&bfj 获取它的地址。

所以,#1 看起来像:

jmp_buf *bfj = new jmp_buf;
...

if( setjmp(*bfj) == 0){
DS[SP-2].int_val=(intptr_t)bfj;

而 #2 看起来像:

jmp_buf bfj;
...

if( setjmp(bfj) == 0){
DS[SP-2].int_val=(intptr_t)&bfj;

另一个潜在的问题是你永远不应该将指针转换为int,因为指针可能会比 int 占用更多的内存(这发生在常见的 64 位编程模型上)。如果不能直接存储指针,则应使用intptr_t

【讨论】:

  • 非常感谢您的回答。但我得到错误无法从 'int *' 转换为 jmp_buf。我该怎么办?
  • @angela - 你用int * 代替intptr_t 吗(它们不一样)。
  • 谢谢!(你是对的)但似乎 longjmp 不会回到 setjmp。但是在其他地方。是否需要显示我的代码?
  • 好吧,我跟踪了代码,它表明它处于循环中!它不会终止。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多