Объявление переменной в первом случае - PullRequest
4 голосов
/ 15 мая 2019

Почему я получаю предупреждение, когда объявляю одно и то же имя переменной в разных случаях switch-case.

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

   case 2:
     int a;
   break;

}

Есть ли способ сделать это без предупреждения. (Не ставя его перед выключателем - кейс)

Ответы [ 3 ]

10 голосов
/ 15 мая 2019

Причина в том, что лексическая область действия обоих объявлений - весь текст переключателя;все случаи разделяют эту область.
То есть с точки зрения лексической области это похоже на запись

{
    int a;
    int a;
}

Решение состоит в том, чтобы заключить объявления в другую ограниченную область.

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

   case 2:
   {
     int a;
     break;
   }
}

(Независимо от того, поместите ли вы break внутри или снаружи скобок, это, в основном, дело вкуса. Я предпочитаю включать весь случай.)

Это работает по той же причине, по которой этот «выключатель»Фрагмент работы:

{
    {
        int a;
    }
    {
        int a;
    }
}
3 голосов
/ 15 мая 2019

Объявите ваши переменные внутри нового блока кода. Начать новый блок кода с {

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

   case 2:
   {
     int a;
      break;
   }
}
1 голос
/ 15 мая 2019

Существует две причины.

  • Все, что внутри { ... } элемента switch, находится в той же области, если вы не добавите в нее дополнительные локальные области.Таким образом, у вас не может быть двух переменных с одинаковым именем по той же причине, что и у вас:

    int main (void) 
    {
      int a; int a; // will not compile
    }
    
  • Грамматически case x: работает как метка.В синтаксисе C формально он называется помеченный оператор , а за помеченным оператором может следовать только оператор , а не объявление.Таким образом, вы не можете иметь объявление переменной сразу после case x:, по той же причине, что и у вас не может быть

    int main (void) 
    { 
      label: int a; // will not compile
    }
    

Лучшее решение - создать еще одну локальную область длядело.Или переименуйте переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...