Я пытаюсь сделать макрос, который расширяет символическую константу до оператора case
следующим образом:
// #define WM_PAINT 0x000F
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
BIND_MSG(WM_PAINT)
// -> case WM_PAINT: Wnd_Main_WM_PAINT (hWnd, wParam, lParam); break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
Я пробовал много вещей. Лучший рабочий макрос, который я получил, был:
#define BIND_MSG(msg) case (msg): Wnd_Main_##msg (hWnd, wParam, lParam); break;
Но этот макрос расширяется не до Wnd_Main_WM_PAINT
, а до Wnd_Main_0x000F
. Когда я пробую Wnd_Main_ ## #msg
вместо Wnd_Main_##msg
, я получаю не Wnd_Main_WM_PAINT
, а Wnd_Main_
. Есть ли возможность объединить Wnd_Main_
с именем символической константы WM_PAINT
?
(Извините, скриншот на немецком языке. Visual Studio говорит, что идентификатор Wnd_Main_0x000F
не определен.)
Wnd_Main_WM_PAINT
. - person chris   schedule 09.02.2014WM_PAINT
определен как#define WM_PAINT 0x000F
? - person Cubi73   schedule 09.02.2014Wnd_Proc_0x000F
. - person Cubi73   schedule 09.02.2014WM_PAINT
принудительно выполняется через промежуточное расширение, что-то, что используется для текстовых макросов как это. Лучший вопрос: если вы делаете это, почему бы просто не использовать взломщики сообщений вwindowsx.h
- person WhozCraig   schedule 09.02.2014Wnd_Main_WM_PAINT
, Visual Studio доWnd_Main_0x000F
- person Cubi73   schedule 09.02.2014