Top.Mail.Ru
Уведомления
Очистить все

[Решено] Ошибка transfer of control bypasses initialization of

oFix
 oFix
(@ofix)
New member

Всем привет, делаю проект на STM32, но тему решил создать здесь, поскольку она в принципе относится к программированию.

Итак, суть в ошибке: transfer of control bypasses initialization of

Изначально возникла в рабочем проекте, в процессе попыток разобраться свел код до минимального, который позволяет воспроизвести эту ошибку:

  int status = 0;
  switch (status)
  {
    case 0:
      int temp = 2;
      temp = 3;
      break;
      
    default:
      break;
  }

Компилятор указывает на строку "int temp = 2;" Помогите понять, в чем дело...

Цитата
Создатель темы Размещено : 07.07.2021 19:50
Aveal
(@aveal)
Top level Admin

Ошибка тут возникает из-за того, что операторы case это по сути goto. Поэтому возникает недопустимая ситуация обхода инициализации переменной.

Допустим есть также блок case 1:

int status = 1;
switch (status)
{
  case 0:
    int temp = 2;
    temp = 3;
    break;
      
  case 1:
    temp++;
    break;
      
  default:
    break;
}

Из-за того, что поведение case схоже с goto, то case не ограничивает область видимости переменной. То есть переменную temp в данном примере можно использовать и после case 0, ее область видимости - весь блок switch.

Пусть status = 1, тогда переходя в case 1 мы получаем ситуацию, когда переменная temp объявлена, но не проинициализирована, поскольку в case 0 мы не попадали. Именно эта ситуация запрещена стандартом языка, что абсолютно оправданно и необходимо, потому что, в частности тут, попадая в case 1 мы работаем с переменной, значение которой никак явно не задается.

Два варианта решения:

1. Использовать if-else вместо switch.

2. Добавить фигурные скобки в case X:

int status = 1;
switch (status)
{
  case 0:
  {
    int temp = 2;
    temp = 3;
    break;
  }
      
  case 1:
  {
    temp++;
    break;
  }
      
  default:
    break;
}

Тогда область видимости temp будет ограничена скобками, то есть в case 1 эту переменную компилятор не позволит использовать в принципе.

ОтветитьЦитата
Размещено : 09.07.2021 21:52
oFix
 oFix
(@ofix)
New member

О как) Я уж грешил на какой-то баг компилятора 😀 Оказывается все логично... Спасибо за объяснение @aveal!

ОтветитьЦитата
Создатель темы Размещено : 13.07.2021 12:01
Поделиться: