为什么不能在 switch
语句的 case
标签之后声明变量?在 C++ 中,你几乎可以在任何地方声明变量(并且将它们声明在首次使用附近显然是件好事),但以下代码仍然无法工作:
switch (val)
{
case VAL:
// 这样做不会起作用
int newVal = 42;
break;
case ANOTHER_VAL:
...
break;
}
上述代码会给我以下错误(MSC):
‘newVal’ 的初始化被 ‘case’ 标签跳过
这似乎也是其他语言的一个限制。为什么会存在这样的问题?
Case 语句只是标签。这意味着编译器会将其解释为直接跳转到该标签。在 C++ 中,这里的问题是作用域问题。你的花括号定义了 switch 语句内部的作用域。这意味着你将得到一个作用域,在这个作用域中,跳转会进一步进入代码并跳过初始化。
正确处理这个问题的方法是在特定的 case 语句中定义一个特定的作用域,并在其中定义你的变量:
switch (val)
{
case VAL:
{
// 这样可以工作
int newVal = 42;
break;
}
case ANOTHER_VAL:
...
break;
}