C++ 无壳开关

C++ 无壳开关,c++,switch-statement,language-design,C++,Switch Statement,Language Design,今天,我意外地发现我的编译器在没有case的switch语句中编写代码时没有抱怨。(它确实抱怨缺少案例陈述,但在代码后面添加了一条之后,甚至没有警告让我知道代码是无用的。) 我试图弄清楚允许下面的代码是有目的的,还是仅仅是“限制它需要更多的工作,所以它是被允许的” #包括 void foo(){ std::cout是的,行为与语言中设计的一样,您可以在不同的位置添加代码。Switch语句比外观复杂得多,并且它们允许使用非常深奥的代码,不管它是否有意义 如果您想花一些时间了解开关的一些奇怪用法以及

今天,我意外地发现我的编译器在没有case的switch语句中编写代码时没有抱怨。(它确实抱怨缺少案例陈述,但在代码后面添加了一条之后,甚至没有警告让我知道代码是无用的。)

我试图弄清楚允许下面的代码是有目的的,还是仅仅是“限制它需要更多的工作,所以它是被允许的”

#包括
void foo(){

std::cout是的,行为与语言中设计的一样,您可以在不同的位置添加代码。Switch语句比外观复杂得多,并且它们允许使用非常深奥的代码,不管它是否有意义

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

:-

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


这是什么编译器?我在MSVC 2012和GCC 4.8.1.Hmm上都测试了这一点。有趣的是,我想到的一个想法是不必编写默认值,而只需在最后一种情况下编写代码。但是,这可能是一个糟糕的做法:)你试过在GCC上使用
-Wall
吗?嗯,我试过在一个古老的版本上使用
-Wall
在GCC(AIX上为3.3.2)中,我收到了一条无法访问的代码警告我没有警告,我不会把MSDN称为源,如果有什么标准是源代码。是的,我确实看了C++标准,但没有得到太多。我所做的只是证明自己似乎没有任何限制它。它更多的是“因为缺少规则而允许”。事情。@MadScienceDreams:这是非法的,因为case语句绕过了x的初始化。@Shirik啊误读了它,仍然没有理解允许这段代码的意义。boost的实现通常让我害怕,但现在你激发了我的好奇心。@Shirik开关魔法的典型例子是:一个与do wh交织在一起的开关我很高兴有人提到达夫的装置。我(很少)在嵌入式系统上使用这种魔法可以分解长函数并使它们更容易重新启动。但是,如果在使用“goto”时感到脏,那么在使用开关作为这种入口点之前,您可能应该仔细考虑一下。它不回答de-OP问题,也不具体。
#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;
      }
   }
}