Подстановка макроса кода C ++ - PullRequest
1 голос
/ 25 марта 2011

1) - у меня есть два перечисления

enum FixedScriptingEvent {
    FIXED_SCRIPTING_EVENT_NOTOUCH,  
    FIXED_SCRIPTING_EVENT_OVER_MOVED,
    FIXED_SCRIPTING_EVENT_OVER_RELEASED,    
    FIXED_SCRIPTING_EVENT_OUTSIDE_RELEASED,
    FIXED_SCRIPTING_EVENT_OUTSIDE_MOVED,    
...

enum InputState {

    INPUT_STATE_NOTOUCH,
    INPUT_STATE_OVER_MOVED,
    INPUT_STATE_OVER_RELEASED,
    INPUT_STATE_OUTSIDE_RELEASED,
    INPUT_STATE_OUTSIDE_MOVED,  
    INPUT_STATE_OUTSIDE_PRESSED,
...

2) У меня есть связь между этими двумя макросами, и мне нужно вызывать этот код для каждого

if (inputMonitor.state.current == INPUT_STATE_NOTOUCH) {
    executeScriptsForEvent( FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_NOTOUCH );
}
if (inputMonitor.state.current == INPUT_STATE_MOVED) {
    executeScriptsForEvent( FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_MOVED );
}

3), поэтому ясделал этот макрос

    #define EXECUTEFIXEDSCRIPTEVENTFORSTATE(x, y) if (inputMonitor.state.current == x) {executeScriptsForEvent( y );}

    EXECUTEFIXEDSCRIPTEVENTFORSTATE(INPUT_STATE_NOTOUCH, FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_NOTOUCH);
    EXECUTEFIXEDSCRIPTEVENTFORSTATE(INPUT_STATE_OVER_MOVED, FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_OVER_MOVED);
    EXECUTEFIXEDSCRIPTEVENTFORSTATE(INPUT_STATE_OVER_RELEASED, FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_OVER_RELEASED);

    #undef EXECUTEFIXEDSCRIPTEVENTFORSTATE(x, y)

, что хорошо

4) вопрос, как я могу сделать что-то подобное

#define EXECUTEFIXEDSCRIPTEVENTFORSTATE(x)\
if (inputMonitor.state.current == INPUT_STATE_(x)) {\
executeScriptsForEvent( FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_(x) );
}\

так что янужно только

    EXECUTEFIXEDSCRIPTEVENTFORSTATE(NOTOUCH);

, что должно быть эквивалентно моему току:

EXECUTEFIXEDSCRIPTEVENTFORSTATE(INPUT_STATE_NOTOUCH, FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_NOTOUCH);

, но компилятор утверждает, что NOTOUCH не определен, поэтому я не могу макрос из 4

1 Ответ

4 голосов
/ 25 марта 2011

Конкатенация токенов?

#define EXECUTEFIXEDSCRIPTEVENTFORSTATE(x)\
if (inputMonitor.state.current == INPUT_STATE_ ## x) {\
executeScriptsForEvent(FIXED_SCRIPTING_EVENT_INPUT_STATE_CHANGED_TO_ ## x);\
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...