Макрос C ++ для условно скомпилированного кода? - PullRequest
4 голосов
/ 10 сентября 2011

Я хочу скомпилировать код условно на основе макроса. В основном у меня есть макрос, который выглядит так (упрощенно от реальной версии):

#if DEBUG
    #define START_BLOCK( x ) if(DebugVar(#x) \
        { char debugBuf[8192];
    #define END_BLOCK( ) printf("%s\n", debugBuf); }
#else
    #define START_BLOCK( x ) (void)0;
    #define END_BLOCK( ) (void)0;
#endif

Проблема в том, что если определено DEBUG, вы можете сделать что-то вроде:

START_BLOCK( test )
     char str[] = "Test is defined";
     strcpy(debugBuf, str);
END_BLOCK( )

START_BLOCK( foo )
    char str[] = "Foo is defined";
    strcpy(debugBuf, str);
END_BLOCK( )

И все работает нормально, потому что каждый блок находится в пределах своей области видимости. Однако, если DEBUG не определен, вы получите переопределение str во втором блоке. (Ну, вы бы также получили debugBuf не определено, но это всего лишь побочный эффект упрощенного примера.)

Я бы хотел, чтобы #else был примерно таким:

#else
    #define START_BLOCK( x ) #if 0
    #define END_BLOCK( ) #endif
#endif

Или какой-то другой метод отсутствия компиляции между начальными / конечными блоками. Я пробовал вышеизложенное, я тоже пробовал что-то вроде:

#else
    #define NULLMACRO( ... ) (void)0
    #define START_BLOCK( x ) NULLMACRO(
    #define END_BLOCK( ) )
#endif

без удачи.

Есть ли способ, чтобы это сработало? Одна мысль, которая только что пришла мне в голову, заключается в том, что я могу злоупотребить оптимизирующим компилятором и использовать:

#else
    #define START_BLOCK( x ) if(0){
    #define END_BLOCK( ) }
#endif

И верь, что он просто полностью скомпилирует блок. Есть ли другие решения?

Ответы [ 2 ]

5 голосов
/ 10 сентября 2011

То есть вам нужны условные блоки с их собственной областью действия?

Вот довольно читаемое решение, которое использует компилятор для оптимизации:

#define DEBUG 1

if (DEBUG) {
    // ...
}

А вот препроцессортолько:

#define DEBUG 1

#ifdef DEBUG
    #define IFDEBUG(x) {x}
#else
    #define IFDEBUG(x)
#endif

IFDEBUG(
    // ...
)

или вручную:

#define DEBUG 1

#ifdef DEBUG
{
    // ...
}
#endif
1 голос
/ 10 сентября 2011

Будет:

#if DEBUG
    #define START_BLOCK( x ) if(DebugVar(#x) \
        { char debugBuf[8192];
    #define END_BLOCK( ) printf("%s\n", debugBuf); }
#else
    #define START_BLOCK( x ) {
    #define END_BLOCK( ) }
#endif

сделать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...