已解决:我想出了一种使用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()用于...
exit()
,它是80年代末90年代初的程序,它将C ++转换为C(当时没有模板或异常),因为几乎没有本机C ++编译器。