На данный вопрос уже ответили:
Никак не могу понять, в чём ошибка в коде. Например, если я пишу вот так:
fstream f("data.txt");
switch (choosing)
{
case 1:
f >> size >> x;
break;
case 2:
break;
}
То всё работает пркрасно, но, если я напишу:
switch (choosing)
{
case 1:
fstream f("data.txt");
f >> size >> x;
break;
case 2:
break;
}
То получуошибку вида:
Ошибка C2360 пропуск инициализации "f" из-за метки "case" Train d:\c++ projects\train\train\source.cpp 71
Вопрос, что не так? Ведь по сути, я просто переношу инициализацую файловой переменной изнутри case наружу?
Дело в том что в С++ конструкция switch / case является замаскированным goto и case блоки не создают области видимости. У вас происходит примерно вот это:
if(1 == choosing)
{
goto mark1;
}
if(2 == choosing)
{
goto mark2;
}
{
mark1:
fstream f("data.txt");
f >> size >> x;
goto ending;
mark2:
// если choosing 2, то мы попадаем сюда, пропуская инициализацию f
goto ending;
}
ending:;
Соответственно для каждого case следует вручную создавать новую область видимости:
switch (choosing)
{
case 1:
{
fstream f("data.txt");
f >> size >> x;
}
break;
case 2:
{
}
break;
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости