【发布时间】:2013-08-08 18:46:36
【问题描述】:
今天,我无意中发现,在没有大小写的 switch 语句中编写代码时,我的编译器不会报错。 (它确实抱怨缺少 case 语句,但是在代码后面添加一个之后,并没有警告让我知道代码没用。)
我试图弄清楚是否有允许以下代码的目的,或者它是否只是“限制它的工作量更大,所以允许它”的那些事情之一。
#include <iostream>
void foo() {
std::cout << "foo" << std::endl;
}
int main()
{
for (int a = -10; a < 10; ++a)
{
switch(a)
{
foo();
case 4:
std::cout << "4" << std::endl;
}
}
}
现在当 a == 4 时,它会按预期输出“4”,并且它永远不会输出 foo。所以问题是,是否有一些(可能深奥但有用的)理由允许在第一个案例之前使用声明 foo();?我确定我不能在那里声明和初始化变量。
(FWIW,我已经在几个编译器上对此进行了测试,它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)
【问题讨论】:
-
这是什么编译器?
-
我已经在 MSVC 2012 和 GCC 4.8.1 上测试过了。
-
嗯,很有趣。想到的一个想法是不必编写默认值:而只需在最后一种情况下编写代码。但是,这尖叫着潜在的不良做法:)
-
你试过在 GCC 中使用
-Wall吗? -
好吧,我试过
-Wall。在 GCC 的古董版本(AIX 上的 3.3.2)上,我收到了无法访问的代码警告。在较新的版本(Cygwin 上的 4.5.3)上,我没有收到任何警告。
标签: c++ switch-statement language-design