今天,我偶然发现我的编译器在没有大小写的情况下在switch语句中编写代码时没有抱怨。 (它确实抱怨缺少案例陈述,但在代码之后添加一个,没有一个警告让我知道代码是无用的。)
我正在试图弄清楚是否有允许以下代码的目的,或者它只是其中一个“限制它的更多工作,所以它是允许的”。
#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,我已经在几个编译器上对此进行了测试,并且它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)
答案 0 :(得分:8)
是的,行为与语言一样,您可以在不同的地方添加代码。 Switch语句比外观复杂得多,它们允许非常深奥的代码,无论它是否有意义。
如果你想花一些时间查看switch
的一些奇怪用法和案例的位置,你可以在boost asio库中查看协同程序的实现。您可以使用宏编写一个小函数,编译并查看生成的代码(在宏扩展之后)的样子。
答案 1 :(得分:3)
来自MSDN: -
声明可以出现在复合声明形成的头部 开关体,但声明中包含的初始化是 不执行。 switch语句将控制权直接转移到 正文中的可执行语句,绕过包含的行 初始化。