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?