На данный вопрос уже ответили:
Никак не могу понять, в чём ошибка в коде. Например, если я пишу вот так:
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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
q2 главное стартовое окноУ него есть кнопка QButton pushButton
Как сделать так, чтобы после вывода 20 рандомных чисел пиcалось есть чётные числа или нет?
Написал функцию создания матрицы и подсчета её определителя, но не могу написать функцию вывода матрицыВместо всех строк и столбцов вывод...