切换无案例

Shi*_*rik 13 c++ language-design switch-statement

今天,我偶然发现我的编译器在没有case的情况下在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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当a == 4时,这会按预期输出"4",并且它永远不会输出foo.所以问题是,是否有一些(可能是深奥但有用的)理由允许foo();在第一个案例之前发表声明?我知道我不能在那里声明和初始化变量.

(FWIW,我已经在几个编译器上对它进行了测试,它们都产生了相同的行为.令人惊讶的是,它们都没有输出警告.)

Dav*_*eas 8

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

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

  • @Shirik switch-sorcery的典型例子是[Duff的设备](http://en.wikipedia.org/wiki/Duff's_device):一个与do-while交织在一起的开关. (4认同)
  • 不回答OP问题,而且不具体。 (3认同)