||
比 更简洁,更容易输入if (...)
,所以我想要一种方法来执行以下操作(这在我的代码中经常发生):
int bar() {...; return successFlag;}
int foo() {
bar() || return(...); // return early on errors
...
}
可能吗?
或者更好的是,是否可以return
返回main
from bar
,而不是链接 through foo
?
对于第一部分,no:return
是关键字,而不是表达式,因此它不能以那种形式组合。我认为您本能地||
将字面意思理解为英语意义上的“或”——显然这不是它的意思。
对于第二部分,您可以(理论上)使用异常,但强烈建议不要这样做。异常适用于“异常情况”,更具体地说,是代码无法在本地恢复的错误条件(在当前函数/方法的上下文中),并且必须在更高级别确定正确的操作。
使用异常作为一般的流控制机制有两个问题:
性能:C++ 编译器针对“非异常”代码路径进行了优化(因为这是正常情况下应该发生的),因此异常处理机制往往非常缓慢。这不是由于缺乏代码优化,而是由于机制需要在没有异常的情况下具有零或接近零的成本,即使成本是异常需要大量工作来处理。
代码清晰度/可测试性:对控制流使用异常会使代码非常难以单独阅读和正确进行单元测试。
对于第一部分 - 不。第二个:setjmp 和 longjmp。但请注意,它们都颠覆了通常的基于 C++ 堆栈的析构函数调用,并且可能无法很好地与异常混合。