Переключатель прыгает в неожиданном месте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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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