2010-04-19 24 views
9

È possibile inserire una macro in una macro in C++?Macro in macro

Qualcosa di simile:

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

ho provato e non ha funzionato quindi la mia ipotesi è che non funziona, a meno che non ci sia una sorta di sintassi che può risolvere il problema?

risposta

11

No, ma si può semplicemente effettuare il refactoring tirando lo #ifdef come il terzultimo e utilizzando due diverse versioni #define Something ... per i rami vero e falso dello #ifdef.

15

Macro, sì. direttive del preprocessore, che sono ciò che hai postato, non

2

No. Ho risposto a questo in c++ macros with memory?

Se si desidera esaminare o modificare l'ambiente di pre-elaborazione, in altre parole per definire una subroutine di pre-elaborazione, piuttosto che una stringa di sostituzione macro, è necessario utilizzare un'intestazione, anche se i motivi legittimi per farlo sono pochi e distanti tra loro.

4

Non è possibile utilizzare le direttive del preprocessore in macro, ma se vogliamo controllare se SomethingElse è definito e chiamare una macro diversa, si potrebbe realizzare in questo modo (richiede un preprocessore C99 e 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) 

Se SomethingElse è definito, chiamerà MACRO1, altrimenti chiamerà MACRO2. Per far funzionare tutto questo, SomethingElse deve essere definito in questo modo:

#define SomethingElse ~, 1, 

Tra l'altro, questo non funzionerà in Visual Studio, a causa di un bug nel loro compilatore, c'è una soluzione qui: http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement