Здравствуйте, LaFlour, Вы писали:
LF>Понятно, что надо объявлять переменную выше, но объясните подробно почему LF>нельзя объявить внутри определенного case?
LF>...
LF>case IDM_RUN:
LF> int i = 10;
LF> break;
LF>...
LF>
LF>то я получаю сообщение, что LF>error C2361: initialization of 'i' is skipped by 'default' label LF>
LF>Понятно, что надо объявлять переменную выше, но объясните подробно почему LF>нельзя объявить внутри определенного case?
Не "внутри", а "после"!
Потому что case — это метка.
Когда программа доходит до следующего case|default, она... продолжает начатое дело.
Соответственно, область видимости переменной — от места ее объявления до конца составного оператора.
А конец у нас — это switch() { ... }.
Аналогично, нельзя делать такой фокус
goto A; // попытка объехать создание переменной
...
int x;
...
A:
...
Особенно это критично для любых инициализируемых переменных, в том числе для объектов с конструкторами.
Хочешь изолировать — пиши
case 1:
case 2:
{
...
int x;
...
}break;
case 3:
...
Перекуём баги на фичи!
Re[2]: Почему не хочет инициализироваться переменная внутри
Здравствуйте, LaFlour, Вы писали:
LF>Здравствуйте, ziserg, Вы писали:
Z>>Здравствуйте, LaFlour, Вы писали:
Z>>Помести ее в блок операторов Z>>
Z>>case IDM_RUN:
Z>>{
Z>> int i = 10;
Z>> break;
Z>>}
Z>>
LF>А объяснение этому есть? с точки зрения компилятора?
в двух словах так:
компилятор создает вызывает конструктор в точке объявления и деструктор в точке выхода переменной из области видимости.
поскольку у тебя видимость переменной i простирается за пределы твоего case, то код для вызова деструктора будет лежать там же.
с другой стороны, конструктор у тебя вызывается в зависимости от того, попал поток в твой case или нет.
Получается, что деструктор вызывается всегда, а конструктор — иногда :), и у компилятора в общем случае нет возможности определить, когда надо, а когда — нет.
А вызывать деструктор для несконструированного объекта очень плохо.
_>В шарпе case не проваливаются друг в друга (в конце обязательна передача управления), поэтому область действия переменной — внутри одного case.
А в джаве?
... << RSDN@Home 1.1.0 stable >>
Re[3]: Почему не хочет инициализироваться переменная внутри