在中间情况下声明变量

时间:2019-05-15 14:03:26

标签: c

为什么在切换用例的不同情况下声明相同的变量名称时,会得到警告。

switch()
{
   case 1:
     int a;
   break;

   case 2:
     int a;
   break;

}

有没有警告的方法来执行此操作。 (无需将其放在开关盒之前)

3 个答案:

答案 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:

最好的解决方案是为每个案例创建另一个本地范围。或重命名变量。