Команда switch-case после выполнения break

У меня есть программа C Win32

Существует функция обработчика сообщений, в которой есть операторы switch-case для обработки сообщений.

Есть одно явление, которое меня поразило... Попробую объяснить простыми словами.

switch (Message)
{
case 0:
    printf("Case 0 \n");
    break;
case 1:
    printf("Case 1 \n");
    break;
    printf("After Break Case 1 \n");
case 2:
     switch( WHAT_SC(wParam) ) {
        case 1:
        case 2:
           if (KEYBOARD_UNLOCKED()) {
             defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam);
           }
           break;
        case 3:
           if (bLockWindowSize) {
              return (TRUE);
           }
        default:
            defstatus = DefWindowProc(hWnd, iMessage, wParam, lParam);
            break;
    }
    break;
    HANDLE_MSG(hWnd, WM_COMMAND, Func_OC);
case 3:
    printf("Case 3 \n");
    break;
    printf("After Break Case 3 \n");
default :
    printf("default \n");
    break;
    printf("After Break default \n");
}

(Вышеприведенный код является просто псевдокодом). В какой-то момент команда после разрыва выполняется. то есть

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC);

Почему/как это?

Спасибо


person Clueless Programmer    schedule 10.06.2014    source источник
comment
Это в отладочной или релизной версии?   -  person cup    schedule 10.06.2014
comment
Этого не должно быть, если предыдущий разрыв действительно относится к случаю внешнего переключателя (т.е. нет дополнительного цикла for чего-то подобного). Можете ли вы опубликовать реальный код?   -  person Nicolas Defranoux    schedule 10.06.2014
comment
Почему у вас есть заявление после break? Разве компилятор не предупреждал о недоступности кода? Измените уровень предупреждения на самый высокий уровень (/W4).   -  person doptimusprime    schedule 10.06.2014
comment
псевдокода недостаточно!   -  person zdd    schedule 10.06.2014
comment
Вы уверены, что HANDLE_MSG выполняется из этого кода? Стек вызовов проверяет это?   -  person doptimusprime    schedule 10.06.2014
comment
Привет Кубок - Освобождение. ~~ Привет, Николас. Мне очень жаль, что я не могу этого сделать, но уверяю вас, что внешнего цикла нет. ~~ Привет, dBasic - не предупреждал, но да, я попробую (не знаю, где эта опция в VS 2008)   -  person Clueless Programmer    schedule 10.06.2014
comment
Привет, dBasic. Да, стек вызовов проверяет и срабатывает точка останова.   -  person Clueless Programmer    schedule 10.06.2014
comment
Выложите реальный код. Ошибка, скорее всего, очень тривиальная, вызванная ошибкой операторов break.   -  person Lundin    schedule 10.06.2014
comment
Вы уверены, что эта строка выполняется или вызывается та же функция откуда-то еще?   -  person dave    schedule 10.06.2014


Ответы (2)


ПРОБЛЕМА РЕШЕНА ...

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

Выполняется здесь по следующей причине

HANDLE_MSG (это МАКРОС. когда я посмотрел его определение, я увидел следующий код в WindowsX.h

 #define HANDLE_MSG(hwnd, message, fn)    \
     case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

Что происходит, так это то, что макрос HANDLE_MSG в случае переключения .. заменяется кодом в WindowxS.h

Это действует как еще один случай, поэтому выполняется с возвратом.

Спасибо всем, кто пытался мне помочь.

(Cup и dBase заслуживают особой благодарности)

С уважением :( Невежественный программист

person Clueless Programmer    schedule 10.06.2014
comment
Это все еще не решает ваш вопрос (вышеприведенный код - это просто псевдокод). В какой-то момент команда после перерыва выполняется. то есть HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); - person Vagish; 10.06.2014
comment
Внимательно прочитайте вопрос. Команда после Break выполняется время от времени ....... т.е. когда это условие истинно. Это ДЕЙСТВУЕТ как другой случай. - person Clueless Programmer; 10.06.2014
comment
Возможно, вы захотите принять свой собственный ответ, поэтому он будет закрыт. - person alk; 11.06.2014

Это может произойти только в том случае, если оператор break тормозит какой-либо цикл внутри переключателя или другой случай переключателя внутри случая переключателя.

Если ты видишь

 HANDLE_MSG(hWnd, WM_COMMAND, Func_OC); 

выполняется, то должен быть выполнен «случай 3».

person Vagish    schedule 10.06.2014