我一直在想这个问题——为什么不能在switch语句的case标签后面声明变量呢?在c++中,你可以在任何地方声明变量(并且在第一次使用时声明它们显然是一件好事),但以下仍然不能工作:

switch (val)  
{  
case VAL:  
  // This won't work
  int newVal = 42;  
  break;
case ANOTHER_VAL:  
  ...
  break;
}  

上面给了我以下错误(MSC):

'newVal'的初始化被'case'标签跳过

这在其他语言中似乎也是一个限制。为什么这是一个问题?


当前回答

如果你的代码说“int newVal=42”,那么你可以合理地期望newVal永远不会是未初始化的。但是如果你浏览这条语句(这就是你正在做的),那么就会发生这样的事情——newVal在作用域内,但没有被分配。

如果这是你真正想要发生的,那么语言需要通过“int newVal;newVal = 42;"。否则,您可以将newVal的范围限制为单个情况,这更可能是您想要的结果。

如果你考虑相同的例子,但加上"const int newVal = 42;"

其他回答

我最喜欢的邪恶切换技巧是使用if(0)跳过不需要的case标签。

switch(val)
{
case 0:
// Do something
if (0) {
case 1:
// Do something else
}
case 2:
// Do something in all cases
}

但非常邪恶。

如果你开始一个新块,你可以在switch语句中声明变量:

switch (thing)
{ 
  case A:
  {
    int i = 0;  // Completely legal
  }
  break;
}

原因是与在堆栈上分配(和回收)空间以存储局部变量有关。

交换机的整个部分是一个单独的声明上下文。你不能像那样在case语句中声明变量。试试这个吧:

switch (val)  
{  
case VAL:
{
  // This will work
  int newVal = 42;
  break;
}
case ANOTHER_VAL:  
  ...
  break;
}

newVal存在于开关的整个作用域中,但只有在VAL分支被命中时才会初始化。如果你在VAL中创建一个代码块,它应该是OK的。

新变量只能在块范围内声明。你需要这样写:

case VAL:  
  // This will work
  {
  int newVal = 42;  
  }
  break;

当然,newVal只在大括号内有作用域……

干杯,拉尔夫