为什么在切换用例的不同情况下声明相同的变量名称时,会得到警告。
switch()
{
case 1:
int a;
break;
case 2:
int a;
break;
}
有没有警告的方法来执行此操作。 (无需将其放在开关盒之前)
答案 0 :(得分:10)
原因是两个声明的词法范围都是整个switch主体;所有案例都具有相同的范围。
也就是说,就词汇范围而言,这就像写作
{
int a;
int a;
}
解决方案是将声明包含在另一个括号内。
switch(whatever)
{
case 1:
{
int a;
break;
}
case 2:
{
int a;
break;
}
}
(无论您将break
放在牙套的内部还是外部,都是出于品味的问题。我希望将整个案例都包括在内。)
这与“无开关”代码段起作用的原因相同:
{
{
int a;
}
{
int a;
}
}
答案 1 :(得分:3)
在新的代码块中声明变量。使用{
switch()
{
case 1:
{
int a;
break;
}
case 2:
{
int a;
break;
}
}
答案 2 :(得分:1)
有两个原因。
{ ... }
的{{1}}内的所有内容都位于同一范围内,除非您在其中添加了其他本地范围。因此,由于两个原因,您不能拥有相同名称的两个变量:
switch
在语法上,int main (void)
{
int a; int a; // will not compile
}
的作用就像标签一样。在C语法中,它的正式名称为 labeled-statement ,并且带标签的语句后只能带有 statement ,而不是声明。因此,出于与您无法拥有
case x:
之后直接声明变量
case x:
最好的解决方案是为每个案例创建另一个本地范围。或重命名变量。