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
fonte
2012-01-16 05:42:35