从表达式中间退出而不使用异常

问题描述 投票:1回答:3

已解决:我想出了一种使用setjmp() / longjmp()的干净方法,只需要一个最小的包装,例如:

int jump(jmp_buf j, int i) { longjmp(j, i); return 0; }

这允许在条件表达式中使用jump()。现在,代码:

if (A == 0) return;
output << "Nonzero.\n";

正确翻译为:

return
((A == 0) && jump(caller, 1)),
(output << "Nonzero.\n"),
0;

caller是返回到调用函数中调用点的jmp_buf。干净,简单和高效,其实现定义要比异常情况少得多。谢谢您的帮助!


是否有方法可以在表达式中间模拟流控制构造的使用?是否可以用逗号分隔的表达式x, y使y引起return

Edit:我正在为一种与功能性语言类似的编译器而工作,目标语言是C ++。一切都是源语言中的一种表达,而对目标语言的最简洁,最简洁的翻译则使尽可能多的事物表达成为可能。基本上,目标语言中的分号成为C ++逗号。迄今为止,语言内流控制构造没有出现任何问题。只有return。我只需要一种过早退出以逗号分隔的表达式的方法,并且我不希望使用异常,除非有人可以告诉我在这种情况下它们没有过多的开销。当然,问题是大多数流控制构造不是C ++中的合法表达式。到目前为止,我发现的唯一解决方案是这样的:

try { return x(), // x(); (1 ? throw Return(0) : 0); // return 0; } catch (Return& ret) { return ref.value; }

return语句始终存在(在未到达Return构造的情况下,因此throw必须包装在?:中以使编译器关闭其[ C0]结果在表达式中使用。

我真的很想避免使用异常进行流控制,除非在这种情况下可以证明没有特别的开销;引发异常会导致放松还是在这里发生任何事情?此代码需要以合理的效率运行。我只需要一个相当于void的功能级别。

已解决:我想出了一种使用setjmp()/ longjmp()的干净方法,只需要一个最小的包装,例如:int jump(jmp_buf j,int i){longjmp(j,i);返回0; }这允许jump()用于...

c++ exception return-value inline control-flow
3个回答
1
投票
[您可能想研究exit(),它是80年代末90年代初的程序,它将C ++转换为C(当时没有模板或异常),因为几乎没有本机C ++编译器。

1
投票
做什么? C ++是命令式语言。表达式只是表达式。如果您想将所有内容都用作表达式/函数,请使用函数式语言。

0
投票
我感觉到您只是具有如何执行翻译过程的功能说明(例如,根据前置条件和后置条件)。由于C ++是[[not
© www.soinside.com 2019 - 2024. All rights reserved.