Переключатель прыгает в неожиданном местеC++

Программы на C++. Форум разработчиков
Anonymous
Переключатель прыгает в неожиданном месте

Сообщение Anonymous »

Я создал форк проекта C++ и добавил несколько случаев в переключатель. Затем он перескакивает в середину следующего случая. Условие — int, значения регистра — #defined. Поскольку код большой, я пишу здесь что-то эквивалентное и простое:

Код: Выделить всё

#define AAA 1
#define BBB 2
int X::func(int i) {
bool b = (i == 5);
int v = (b ? 10 : 5);
switch (i) {
case AAA:
if (b && v > 4) {
v = v + 1;
return 0;
}
break;
case BBB:
if (!b || v > 40) {
v = v + 2;
b = false; // direct jump here from the switch for i = AAA
return 0;
}
break;
}
return -1;
}
Если я передам AAA в X::func, выполнение кода перейдет непосредственно от переключателя к b = false; внутри случая BBB . В реальном коде у меня десятки случаев, и это происходит посередине. Если я прокомментирую полностью регистр BBB, он появится в том же месте в комментариях! Каждый регистр заканчивается разрывом; и внутри него нет объявления переменных. Как и здесь переменные b и v, они объявляются перед оператором переключения.

Часть случаев находится в #ifdef #endif блокировать. Дополнительные случаи возникновения проблемы находятся в этом блоке. Условие истинно, поэтому блок компилируется. В любом случае, я протестировал его после подавления этих двух операторов прекомпилятора, и это то же самое.

Если я добавлю скобки {, чтобы полностью охватить случаи как здесь, у меня все тот же результат:

Код: Выделить всё

case BBB: {
if (!b || v > 40) {
v = v + 2;
b = false; // direct jump here from the switch for i = AAA
return 0;
}
break;
}
Все прекрасно компилируется и выполняется одинаково как в сеансе отладки, так и при обычном выполнении. Я использую gcc 4.5.4 под Eclipse CDT Indigo.

Это похоже на ошибку компилятора, но в чем может быть причина?

Подробнее здесь: https://stackoverflow.com/questions/187 ... cted-place

Вернуться в «C++»