Switch-Case:初始化声明&申述和再转让

时间:2010-09-21 05:06:12

标签: c++ switch-statement jump-table

在switch-case语句中初始化声明无效,但允许声明然后分配。如下面的代码片段所示。

编译器端这两种类型的初始化有什么区别?为什么第一种类型的初始化无效,第二种类型是有效的。

switch(val)  
{  
case 0:  
  int newVal = 42;  //Invalid
  break;
case 1:  
  int newVal2;      //Valid
  newVal2 = 42;  
  break;
case 2:
  break;
}

2 个答案:

答案 0 :(得分:10)

实际上,规则是你不能跳过具有初始化(或超过非POD类型变量声明)的声明的块。 C ++标准说(C ++03§6.7):

  

可以转换为块,但不能以初始化绕过声明的方式。从具有自动存储持续时间的局部变量不在其范围内的点跳转(77)的程序是不正确的,除非该变量具有POD类型(3.9)并且在没有初始值设定项的情况下声明(8.5)。

     

(*)从switch语句到case标签的条件的转移在这方面被视为跳跃。

int newVal = 42;是一个具有初始化程序(= 42部分)的声明。该程序格式错误,因为如果val12,您将在初始化后跳转到切换块。

int newVal2;也是一个宣言;因为int是POD类型且声明没有初始值设定项,所以您可以跳过此声明。

答案 1 :(得分:5)

事实上,它们都不是合法的C ++。除非是作用域,否则不能在switch case中声明变量:

switch(val)  
{  
case 0:  
  {
    int newVal = 42;  // now valid
  }
  break;
case 1:  
  {
    int newVal2;      // still Valid
    newVal2 = 42;  
  }
  break;
case 2:
  break;
}

您的编译器允许案例1的事实是编译器的缺陷,或者可能是扩展。至少,根据标准。