Macro C ++ con memoria

Esto se publicó originalmente como una respuesta a las macros c ++ con memoria?

Pero de alguna manera no puedo conseguir esto comstackdo. Puede que me esté perdiendo algo aquí. (Tengo la sensación de que esto es algo que C ++ puede hacer)

main.cpp

#include  using namespace std; const char * hello = "hello"; const char * world = "world"; #define VAR #define MEMORIZE world #include "memorize.h" #define MEMORIZE hello #include "memorize.h" int main() { cout << VAR << endl; return 0; } 

memorizar.h

 #undef VAR #ifndef MEMORIZE # error "No Argument to memorize.h" #endif #define VAR MEMORIZE #undef MEMORIZE 

El error de comstackción que estoy recibiendo es este:

 [100%] Building CXX object CMakeFiles/main.dir/main.cpp.o error: use of undeclared identifier 'MEMORIZE' cout << VAR << endl; ^ note: instantiated from: #define VAR MEMORIZE ^ 1 error generated. make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1 make[1]: *** [CMakeFiles/main.dir/all] Error 2 make: *** [all] Error 2 

Tengo muchas ganas de que esta memoria funcione en la fase de preprocesamiento. ¿Alguien puede ayudar? Creo que BOOST_PP_COUNTER en 1.49 también usa esta técnica pero no pude averiguar cómo.

Está utilizando un solo valor VAR (el último) porque puede tomar solo un valor. Si quiere significar cosas diferentes por VAR según el contexto, necesita tener declaraciones fuente después de cada inclusión.

 #define xstr(a) str(a) #define str(a) #a int main() { #define MEMORIZE world #include "memorize.h" cout << VAR << endl; #undef MEMORIZE #define MEMORIZE hello #include "memorize.h" cout << VAR << endl; return 0; } 

memorizar.

 #undef VAR #ifndef MEMORIZE # error "No Argument to memorize.h" #endif #define VAR xstr(MEMORIZE) 

Está configurando la macro VAR en el token MEMORIZE , que no está definiendo de inmediato. La línea:

 cout << VAR << endl; 

termina como

 cout << MEMORIZE << endl; 

y dado que MEMORIZE no se ha declarado, aparece el error. Piensa que MEMORIZE es un nombre de variable.

#undef MEMORIZE mover la línea #undef MEMORIZE y colóquela justo antes de #define MEMORIZE donde aparezca.