【发布时间】:2019-11-15 06:08:20
【问题描述】:
我发现了一些非常特殊的代码,想知道为什么它可以编译。在switch 中放置了一些与任何case 无关的代码。见下文:
int main()
{
for ( auto i: { 1,2,3,4})
{
switch ( i )
{
case 1:
std::cout << "1" << std::endl;
break;
case 2:
std::cout << "2" << std::endl;
break;
{
std::cout << "What is the sense of this part?" << std::endl;
}
case 3:
std::cout << "3" << std::endl;
break;
default:
std::cout << "default" << std::endl;
break;
}
}
}
gcc (8.3.1) 只抱怨警告:
main.cpp: In function 'int main()':
main.cpp:56:81: warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "What is the sense of this part?" << std::end
main.cpp:59:18: note: here
case 3:
clang (7.0.1) 什么也没说,即使是 -pedantic -Wextra -Wall。
我想知道为什么两个编译器都接受该代码。生成的可执行文件永远不会执行它,这是好事 :-)
是合法的c++代码吗?
【问题讨论】:
-
break;可以出现在case子句中的任何位置。您会发现它通常是有条件的(在if子句中)因此它是法律代码。但是如果检测到 (a) 无法访问的代码或 (b) 可能导致失败的代码,gcc 可以发出诊断消息。 -
无法访问的代码仍然是合法代码。
-
代码没有问题。一般在项目的静态代码分析中会发现这些东西。
标签: c++ language-lawyer