在C++17中引入了fallthrough 属性。该属性主要用于switch 语句中。在C++的switch语句中,如果当前case 分支中不加break , 便会执行下一个case 分支的代码。
如下所示,由于n 的值为1,代码首先执行case 1 分支,然后又因为case 1 分支中没有加break ,所以接着执行case 2 分支、case 3分支 ,一直到default 分支。
#include <iostream>
using namespace std;
int main()
{
int n = 1;
// Switch Cases
switch (n) {
case 1: {
cout << "enter one \n";
}
case 2: {
cout << "enter two \n";
}
case 3: {
cout << "enter three \n";
}
default: {
cout << "enter default \n";
}
}
return 0;
}
所以输出为
enter one? enter two? enter three? enter default?
?而很多C++初学者容易犯这样的错误:在本应当在case 分支中加入break 的时候却忘了加了。于是编译器会针对这种情况输出Warning 信息,提醒程序员他可能忘了加break 了。
> g++-9 -W 1.cpp 1.cpp:14:17: warning: this statement may fall through [-Wimplicit-fallthrough=] ? ?14 | ? ? ? ? cout << "enter one \n"; ? ? ? | ? ? ? ? ? ? ? ? ^~~~~~~~~~~~~~~~~~~~~ 1.cpp:17:5: note: here ? ?17 | ? ? case 2: { ? ? ? | ? ? ^~~~ 1.cpp:18:17: warning: this statement may fall through [-Wimplicit-fallthrough=] ? ?18 | ? ? ? ? cout << "enter two \n"; ? ? ? | ? ? ? ? ? ? ? ? ^~~~~~~~~~~~~~~~~~~~~ 1.cpp:21:5: note: here ? ?21 | ? ? case 3: { ? ? ? | ? ? ^~~~ 1.cpp:22:17: warning: this statement may fall through [-Wimplicit-fallthrough=] ? ?22 | ? ? ? ? cout << "enter three \n"; ? ? ? | ? ? ? ? ? ? ? ? ^~~~~~~~~~~~~~~~~~~~~~~ 1.cpp:25:5: note: here ? ?25 | ? ? default: { ? ? ? | ? ? ^~~~~~~
但是有些时候我们为了实现一些特定的逻辑,所以有意不加break , 但是又不想听到编译器的抱怨,该怎么样让编译器"闭嘴"呢?此时C++17中引入的fallthrough 便派上用场了
#include <iostream>
using namespace std;
int main()
{
int n = 1;
// Switch Cases
switch (n) {
case 1: {
cout << "enter one \n";
[[fallthrough]];
}
case 2: {
cout << "enter two \n";
[[fallthrough]];
}
case 3: {
cout << "enter three \n";
[[fallthrough]];
}
default: {
cout << "enter default \n";
}
}
return 0;
}
编译结果如下,编译器真的"闭嘴"了
> g++-9 -W 1.cpp
|