根据具体上下文,这可能是一种风格问题。我有时会采用以下方法。
考虑到在某个时间点您对其进行了微调。
int num = rand()%3;
为了
int num = rand()%4;
如果这种情况发生,那么您的 switch 语句就不再正确和完整。针对这种情况,您可以添加以下内容:
default:
throw std::logic_error("Oh noes.");
std::logic_error
是用于处理程序团队出现的错误。如果您的团队忘记更新switch
,它将会(希望尽早)出现一个带有追踪信息的终止程序,以便进行排查。
default
的缺点
包含default
子句也有一个缺点。当您在enum
上执行switch
时...
enum class Color {
Red, Green, Blue
};
....
Color c = ....;
switch(c) {
case Color::Red: break;
case Color::Green: break;
};
有些编译器会警告您没有涵盖所有的情况。为了让编译器安静下来,现在您可以做两件事:
Color c = ....;
switch(c) {
case Color::Red: break;
case Color::Green: break;
default: break;
};
Color c = ....;
switch(c) {
case Color::Red: break;
case Color::Green: break;
case Color::Blue: break;
};
你会发现,这两种选择中后者可能更有生产力。但是,这取决于编译器的行为。你仍然可以在默认情况下抛出异常,但将一个本应是好的编译时错误转化为运行时错误,许多人认为前者更可取。
使用早期退出或结构体可以实现两全其美(可移植的错误,加上编译时错误的奖励),之后您可以测试是否命中了某个case。
Color c = ....;
switch(c) {
case Color::Red: return;
case Color::Green: return;
};
throw std::logic_error(...);
MYSQL mysql = {0};
switch(c) {
case Color::Red: mysql = red_database(); break;
case Color::Green: mysql = green_database(); break;
};
if (!mysql)
throw std::logic_error(...);
default
部分,因为正如您已经指出的那样,num没有机会具有不同的值。 - mic4ael