切换无案例

时间:2013-08-08 18:46:37

标签: c++ switch-statement language-design

今天,我偶然发现我的编译器在没有大小写的情况下在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,我已经在几个编译器上对此进行了测试,并且它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)

2 个答案:

答案 0 :(得分:8)

是的,行为与语言一样,您可以在不同的地方添加代码。 Switch语句比外观复杂得多,它们允许非常深奥的代码,无论它是否有意义。

如果你想花一些时间查看switch的一些奇怪用法和案例的位置,你可以在boost asio库中查看协同程序的实现。您可以使用宏编写一个小函数,编译并查看生成的代码(在宏扩展之后)的样子。

答案 1 :(得分:3)

来自MSDN: -

  

声明可以出现在复合声明形成的头部   开关体,但声明中包含的初始化是   不执行。 switch语句将控制权直接转移到   正文中的可执行语句,绕过包含的行   初始化。