Цитата:
Насколько я знаю, любая переменная, согласно стандарту, должна быть объявлена до её использования.
Именно так и никак иначе.
Цитата:
Даже если она не используется, а попадает в область видимости. А область видимости переменных x_central, y_central --- с того места, где они объявлены и до конца оператора switch. Т.е. в область видимости этих переменных попадают case 3, case 4 и т.д., но в них можно попасть, не инициализируя эти переменные. Вот компилятор и ругается.
Нуууу... Скорее всего Вы правы. Прблема в синтаксисе оператора switch. Можно посмотреть например
это, как пример дурости этого оператора. И тут действительно может возникнуть ситуация использования подобной неинициализированной переменной. Однако, переменная вполне объявлена, и все-таки не должна вызывать недоуменя компилятора. Потом посмотрите, он ругается на то, что для case 3, case 4 переменная не инициализирована:
Цитата:
[BCC32 Error] usermenu.cpp(21): E2126 Case bypasses initialization of a local variable
А это, в принципе, не фатальная ошибка, тянет на warning ИМХО.
Добавлено спустя 5 минут 5 секунд:Проверил, следующий код:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
goto aaa;
int b;
aaa:
Label1->Caption = "aaa";
}
Не вызывает ошибки, и такой:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
goto aaa;
int b;
b = 0;
aaa:
Label1->Caption = "aaa";
}
Не вызывает. А такой:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
goto aaa;
int b = 0;
aaa:
Label1->Caption = "aaa";
}
Вызывает ошибку
в Borland Builder 6.0:
Цитата:
[C++ Error] Unit1.cpp(20): E2203 Goto bypasses initialization of a local variable
Однако, непонимаю

. Компилятор ругается, причем фатально, на то, что обходится именно инициализация переменной!
Более того, на такой код тоже ругани нет:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
goto aaa;
int b;
aaa:
b = 1;
Label1->Caption = AnsiString(b);
}
(!!!!!!!!)
Т. е., компилятор вполне себе знает переменную b, даже если место ее объявления заведомо "обходится" оператором goto!
Добавлено спустя 4 минуты 29 секунд:
Может быть, кто-нибудь проверит подобные конструкции в не-Borland'овском компиляторе?