Всем привет, делаю проект на 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;" Помогите понять, в чем дело...
Ошибка тут возникает из-за того, что операторы 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 эту переменную компилятор не позволит использовать в принципе.
О как) Я уж грешил на какой-то баг компилятора 😀 Оказывается все логично... Спасибо за объяснение @aveal!