已解决:我想出了一个干净的方法来使用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
导致 a return
?
编辑:我正在为类似于功能语言的东西开发编译器,目标语言是 C++。一切都是源语言中的表达,而最理智、最简单的目标语言翻译会留下尽可能多的表达。基本上,目标语言中的分号变成了 C++ 逗号。到目前为止,语言内流控制结构没有出现任何问题。它只是return
。我只需要一种过早退出逗号分隔表达式的方法,并且我不希望使用异常,除非有人可以告诉我他们在这种情况下没有过多的开销。
问题当然是大多数流控制结构不是 C++ 中的合法表达式。到目前为止,我发现的唯一解决方案是这样的:
try {
return
x(), // x();
(1 ? throw Return(0) : 0); // return 0;
} catch (Return& ret) {
return ref.value;
}
该return
语句始终存在(在Return
未达到构造的情况下),因此throw
必须将其包装起来?:
以使编译器关闭其void
在表达式中使用的结果。
我真的很想避免使用异常来进行流控制,除非在这种情况下可以证明不会产生特别的开销;抛出异常会导致展开或任何事情吗?此代码需要以合理的效率运行。我只需要一个相当于exit()
.