Я хочу скомпилировать код условно на основе макроса. В основном у меня есть макрос, который выглядит так (упрощенно от реальной версии):
#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
И верь, что он просто полностью скомпилирует блок. Есть ли другие решения?