C ++ Macro pour comstackr le code de manière conditionnelle?

Je veux comstackr du code conditionnellement basé sur une macro. En gros, j’ai une macro qui ressemble à (simplifiée à partir de la version réelle):

#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 

Le problème est que si DEBUG est défini, vous pouvez faire des choses comme:

 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( ) 

Et tout fonctionne bien parce que chaque bloc est dans sa propre scope. Cependant, si DEBUG n’est pas défini, vous obtiendrez une redéfinition de str dans le deuxième bloc. (Vous obtiendrez également debugBuf non défini, mais ce n’est qu’un effet secondaire de l’exemple simplifié.)

Ce que j’aimerais faire, c’est que le #else soit quelque chose comme:

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

Ou une autre méthode consistant à ne pas comstackr quoi que ce soit entre les blocs de début et de fin. J’ai essayé ce qui précède, j’ai aussi essayé quelque chose dans le sens de:

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

sans aucune chance.

Y a-t-il un moyen pour que cela fonctionne? Une idée qui m’est venue à l’esprit est que je pourrais peut-être abuser du compilateur d’optimisation et utiliser:

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

Et croyez bien que cela comstackra complètement le bloc. Y a-t-il d’autres solutions?

Donc vous voulez des blocs conditionnels avec leur propre scope?

Voici une solution assez lisible qui repose sur le compilateur pour l’optimiser:

 #define DEBUG 1 if (DEBUG) { // ... } 

Et en voici un qui est pré-processeur uniquement:

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

Ou manuellement:

 #define DEBUG 1 #ifdef DEBUG { // ... } #endif 

Aurait:

 #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 

faire?