如何(计算)C++中的goto和longjmp?

Cod*_*ker 12 c++ goto longjmp language-extension setjmp

我通常不会编写C++代码,但我的一个奇怪的comp sci朋友厌倦了查看我精彩的FORTRAN程序并挑战我用C++重写其中一个,因为他更喜欢我的C++代码.(我们在这里投入资金.)确切的术语是它需要在现代C++编译器中进行编译.也许他讨厌一个好的conio.h - 我不知道.

现在我意识到在C++中有很好的写作方式,但是我想通过尽可能使我的C++版本成为FORTRAN-esque来获得个人胜利.对于奖励积分,当我转换代码时,这可能会节省一些时间和精力.

所以!这带我进入以下相关查询:

在gotos:

  1. 你是如何工作的?
  2. 对C++中的gotos有什么限制?
  3. 有关范围的任何担忧?(我将尽可能地尝试全局范围,但你永远不会知道.)
  4. 如果我使用GCC扩展转到void指针数组,是否有任何关于未定义行为的新问题等?


在longjmp上:

  1. 你如何安全地使用longjmp?
  2. C++中对longjmps的约束是什么?
  3. 它的作用范围是什么?
  4. 有什么特别的时刻,看起来longjmp应该是安全的,但实际上并不是我应该注意的吗?
  5. 如何使用longjmp模拟计算的goto?
  6. 如果我的程序中只有一个函数,那么使用longjmp over goto有什么明显的好处吗?

现在我的主要关注点是为此计算goto.看起来我可能会使用longjmp来完成这项工作,因为void指针数组不是C++标准的一部分,而是GCC特定的扩展.

Mar*_*k B 7

我会咬人并采取行动.

我非常怀疑你的朋友会发现使用C++编写的Fortran更容易(如果你使用goto和longjmp,这将是你将获得的有效内容)阅读,他甚至可能会发现它更难以理解.C++语言与Fortran有很大不同,我认为你不应该尝试从Fortran到C++的直接转换.它只会让C++更难维护,你可能会继续使用现有的代码库.

goto:你设置一个label(my_label:),然后使用goto命令goto my_label;,这将导致你的程序流在goto之后的语句中执行.您无法跳过变量的初始化或函数之间的跳转.您无法创建goto目标数组,但可以创建要跳转到的对象或函数指针数组.

longjmp:没有理由,更喜欢longjmpgoto,如果你只有一个功能.但是,如果你只有一个函数,那么你真的不是在编写C++,从长远来看,只要维护你的Fortran就会更好.

  • 然后你的目标需要修改. (4认同)
  • 我不明白为什么我的目标是你的绯闻.这个问题仍然合法. (3认同)
  • @Code Maker:我认为这对于一些啤酒而不是在线问答论坛比较合适.没有人会从答案中受益,故意编写复杂而复杂的代码并没有真正的目的,坦率地说,你更有可能产生一个"goto"猎巫,而不是得到任何真正的答案. (2认同)
  • @CodeMaker您正在询问关于getp和longjmps的一般问题,这些问题可以通过阅读文档轻松解答.如果已经实施了"一般参考"关闭理由,那么我将投票结束.*问题的*理想答案基本上是对该文档的重复. (2认同)

ron*_*nag 3

我认为此参考资料包含您正在寻找的大部分信息。

长进

  • 我不会将 MSDN 称为“the”参考,而是“a”参考:)(它指出:“描述在 Microsoft C++ 中实现的 C++ 编程语言。”) (8认同)