虽然我同意大多数建议return
在一般情况下避免使用多个 s 的答案,但有时 multiple return
s 是好的和有用的。例如在 an 上调度enum
:
#include <iostream>
#include <string>
enum direction { north, east, south, west };
std::string to_string(direction d)
{
switch (d)
{
#define CASE(C) case C: return #C
CASE(north);
CASE(east);
CASE(south);
CASE(west);
#undef CASE
}
}
int main()
{
std::cout << to_string(west) << '\n';
}
如果你用 GCC 编译,你会得到(C 或 C++,都是一样的):
$ g++-4.9 -Wall foo.cc
foo.cc: In function 'std::string to_string(direction)':
foo.cc:17:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Clang没有抱怨。实际上,这不是很好,因为它也可以在没有警告的情况下编译它:
int main()
{
std::cout << to_string(direction(666)) << '\n';
}
这导致:
$ clang++-3.5 -Wall foo.cc
$ ./a.out
zsh: illegal hardware instruction ./a.out
因此,必须“对抗” GCC 的警告。一种错误的方法是添加说
default: abort();
到switch
. 当然,它治愈了症状,但是现在如果我添加一个新的 GCC 将不再抱怨direction
,例如zenith
,但忘记将它覆盖在to_string
. 所以真的,在打开 enum 时永远不要使用默认情况。
然后你可以在theabort
之后留下一个switch
(如果不使用 inner return
s 会很笨拙)。