2015-04-25 3 views
0

У меня есть блок кода, который я пытаюсь преобразовать из PHP в C++, и компилятор получает зависание в моих операторах switch.Инициализация переменных (int32) внутри оператора switch

У меня есть кое-что вдоль линий:

switch(//Some int) 
{ 
    case 1: 
    default: 
     int32 x = 1; 
     doSomething(x); 
     break; 
    case 2: 
     doSomething(3); 
     break; 
} 

И это метание ошибки:

ошибка C2360: инициализация 'х' пропускается 'случае' этикеточной


Я, кажется, могу исправить это, объявив и инициализируя переменные за пределами оператора switch, но почему это? В чем проблема с созданием временных переменных в рамках оператора switch?


Просто для дальнейшего уточнения, я только пытаюсь использовать x в том, что один вызове к doSomething(x). Я не пытаюсь использовать его вне сферы действия оператора switch.

ответ

1

Попробуйте добавить {}:

default: 
{ 
    int32 x = 1; 
    doSomething(x); 
    break; 
} 

Согласно стандарту:

можно передать в блок, но не таким образом, который обходит объявления с инициализацией. программы, которая прыгает 91 от точки, где переменный с автоматической продолжительностью хранения не в объеме до точки, где она находится в области видимости плохо, не образуется, если ....

void f() { 
    // ... 
    goto lx; // ill-formed: jump into scope of a 
     // ... 
    ly: 
     X a = 1; 
     // ... 
    lx: 
     goto ly; // OK, jump implies destructor 
       // call for a followed by construction 
       // again immediately following label ly 
} 

91) Перевод с позиции заявления switch на лейбл case считается скачком в этом отношении.

+0

А я вижу. Это не ограничение в PHP, поэтому я никогда не сталкивался с этим раньше. Благодаря :) – David

Смежные вопросы