Всем привет, делаю проект на 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!