2010-04-19 29 views
9

¿Es posible poner una macro en una macro en C++?macros en macros

Algo así como:

#define Something\ 
#ifdef SomethingElse\ //do stuff \ 
#endif\ 

lo intenté y no funcionó así que yo creo que no funciona, a menos que haya algún tipo de sintaxis que se puede arreglar?

Respuesta

11

No, pero puede simplemente refactorizar esto sacando el #ifdef como el toplevel, y usando dos versiones diferentes de #define Something ... para las ramas verdadera y falsa del #ifdef.

15

macros, sí. directivas del preprocesador, que son lo que usted envió, sin

2

No. Me respondió esto en c++ macros with memory?

Si desea revisar o alterar el entorno de procesamiento previo, en otras palabras, para definir una subrutina de procesamiento previo en lugar de una cadena de reemplazo macro, necesita usar un encabezado, aunque las razones legítimas para hacerlo son pocas y distantes.

4

No puede utilizar las directivas de preprocesador de macros, pero si queremos comprobar si se ha definido SomethingElse y llamar a una macro diferente, que podría lograr como este (requiere un preprocesador C99 y la biblioteca Boost.Preprocessor):

#define PP_CHECK_N(x, n, ...) n 
#define PP_CHECK(...) PP_CHECK_N(__VA_ARGS__, 0,) 

//If we define SomethingElse, it has to be define like this 
#define SomethingElse ~, 1, 

#define Something \ 
BOOST_PP_IF(PP_CHECK(SomethingElse), MACRO1, MACRO2) 

Si SomethingElse se define llamará MACRO1, de lo contrario se llamará MACRO2. Para que esto funcione, SomethingElse tiene que definirse así:

#define SomethingElse ~, 1, 

Por cierto, esto no funcionará en Visual Studio, debido a un error en su compilador, hay una solución aquí: http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement