@AlexSku
Программист по автоматике

Как это работает: case залез вовнутрь if'а?

Разбираю пример. Как можно ветку case засунуть вовнутрь if'а? Разве структурный подход это позволяет? Или case это просто метка в любом месте, лишь бы за границы switch не заходить?
(сам я программирую ПЛК, т.е. C++ только изучаю)

По просьбе модератора:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if ( g_IsInitialized )
    {
        switch (message)
        {
        case WM_PAINT:
            Update();
            Render();
            break;
        case WM_SYSKEYDOWN:
        case WM_KEYDOWN:
        {
            bool alt = (::GetAsyncKeyState(VK_MENU) & 0x8000) != 0;

            switch (wParam)
            {
            case 'V':
                g_VSync = !g_VSync;
                break;
            case VK_ESCAPE:
                ::PostQuitMessage(0);
                break;
            case VK_RETURN:
                if ( alt )
                {
            case VK_F11:                              // <------------------------------
                SetFullscreen(!g_Fullscreen);
                }
                break;
            }
        }
        break;
        // The default window procedure will play a system notification sound 
        // when pressing the Alt+Enter keyboard combination if this message is 
        // not handled.
        case WM_SYSCHAR:
        break;
        case WM_SIZE:
        {
            RECT clientRect = {};
            ::GetClientRect(g_hWnd, &clientRect);

            int width = clientRect.right - clientRect.left;
            int height = clientRect.bottom - clientRect.top;

            Resize(width, height);
        }
        break;
        case WM_DESTROY:
            ::PostQuitMessage(0);
            break;
        default:
            return ::DefWindowProcW(hwnd, message, wParam, lParam);
        }
    }
    else
    {
        return ::DefWindowProcW(hwnd, message, wParam, lParam);
    }

    return 0;
}


Update:
на втором мониторе включил отладку: действительно F11 минует первую точку (игнорирует if).
(у F11 и Alt-Enter одно и то же действие - кто-то спрашивал)
5c1a2e9296119599455449.png
  • Вопрос задан
  • 879 просмотров
Пригласить эксперта
Ответы на вопрос 2
@balamyt92
; select * from users; --
Или case это просто метка в любом месте, лишь бы за границы switch не заходить

this, это эдакий goto на стероидах.
Ответ написан
BacCM
@BacCM
C++ почти с рождения
Так можно но не нужно. В каких то старых сишных компиляторах вроде даже можно было по goto перейти между функциями. И зачем-то это использовали и стек руками правили чтобы всё работало.

А это современный C++
Без предупреждений...

for (int i = 0; i < 10; ++i) {
		for_label:;
			cout << i << endl;
	}

	goto for_label;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы