For the world you may just be somebody, but for somebody you maybe the world.ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ- William Michael Rossetti
Algorithm
之前的两期直接把原题贴在的这一节,感觉不太合适,从本期开始,决定不再贴原题,给出题目和解答的链接。
Questions
Answer
Review
C++ Best Practices
C++ Best Practices 101: A miniQMC Case Study
Tips
避免在switch
语句中使用default
我们举几个具体的例子说明一下
- Step one
enum class Values {
val1,
val2
};
std::string_view get_name(Values value) {
switch (value) {
case val1: return "val1";
case val2: return "val2";
}
}
如果你将所有的编译告警打开, 你将会得到这样的告警,control reaches end of non-void function [-Wreturn-type]。
注:(不同的编译器告警信息可能不同)
-
Step two
引入default
语句
std::string_view get_name(Values value) {
switch (value) {
case val1: return "val1";
case val2: return "val2";
default: return "unknown";
}
}
虽然告警消除了,但是引入了新的问题,如下
enum class Values {
val1,
val2,
val3 // added a new value
};
std::string_view get_name(Values value) {
switch (value) {
case val1: return "val1";
case val2: return "val2";
default: return "unknown";
}
// no compiler diagnostic that `val3` is unhandled
}
当我们为枚举类Values
添加新的枚举值的时候,如果我们忘了在处理函数中添加对应的处理,编译器也不会产生任何告警。
-
Step three
Instead, prefer code like this
std::string_view get_name(Values value) {
switch (value) {
case val1: return "val1";
case val2: return "val2";
} // unhandled enum value warning now
return "unknown";
}
Share
……