Ошибка инициализации из-за метки case [дубликат]

242
10 апреля 2019, 02:00

На данный вопрос уже ответили:

  • Странности со switch 2 ответа

Никак не могу понять, в чём ошибка в коде. Например, если я пишу вот так:

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 наружу?

Answer 1

Дело в том что в С++ конструкция 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;
}
READ ALSO
Как вызвать одно окно из слота другого Qt

Как вызвать одно окно из слота другого Qt

q2 главное стартовое окноУ него есть кнопка QButton pushButton

189
Почему выводит 1?

Почему выводит 1?

Почему выводит 1?

167
Посчитать количество чётных чисел [закрыт]

Посчитать количество чётных чисел [закрыт]

Как сделать так, чтобы после вывода 20 рандомных чисел пиcалось есть чётные числа или нет?

182
Нужна помощь с выводом матрицы

Нужна помощь с выводом матрицы

Написал функцию создания матрицы и подсчета её определителя, но не могу написать функцию вывода матрицыВместо всех строк и столбцов вывод...

180