CppCoreGuidelines NR.2 不要坚持在一个函数中只能有一个返回语句
10 January 2024
“Don’t insist to have only a single return-statement in a function”
理由
如果坚持只能有一个返回值的话,会导致代码逻辑很绕,还要引入额外的状态变量。尤其是,这种“只有一个返回值规则”会导致很难在函数的顶部进行错误检测。
例子
template<class T> // requires Number<T> string sign(T x) { if (x < 0) return "negative"; if (x > 0) return "positive"; return "zero"; }
如果只能有一个返回值的话。我们可能要这样写:
template<class T> // requires Number<T> string sign(T x) // bad { string res; if (x < 0) res = "negative"; else if (x > 0) res = "positive"; else res = "zero"; return res; }
这种写法一方面代码更长,另一方面效率更低。代码越长越复杂,就会越痛苦。当然,有些简单的函数本身就只有一个返回语句。因为其本身就只是简单的逻辑。
例子
int index(const char* p) { if (!p) return -1; // error indicator: alternatively "throw // nullptr_error{}" // ... do a lookup to find the index for p return i; }
如果我们遵循一个返回语句规则的话,就成这样了:
int index2(const char* p) { int i; if (!p) i = -1; // error indicator else { // ... do a lookup to find the index for p } return i; }
注意,这里我们故意违反了变量应当初始化规则。因为一个返回语句规则很容易导致变量为初始化错误。而且,这种风格的代码很容易倾向于用 goto exit
方式结束函数。
其他方案
- 保持函数简单短小。
- 放心使用多个返回语句(以及抛出异常)