Вы не можете использовать директивы препроцессора в макросах, но если мы хотим проверить, определено ли SomethingElse
и вызвать другой макрос, вы можете сделать это следующим образом (требуется препроцессор c99 и библиотека 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)
Если определено SomethingElse
, оно вызовет MACRO1
, в противном случае оно вызовет MACRO2
. Чтобы это работало, SomethingElse
должно быть определено так:
#define SomethingElse ~, 1,
Кстати, это не сработает в Visual Studio, поскольку из-за ошибки в их компиляторе есть обходной путь: http://connect.microsoft.com/VisualStudio/feedback/details/380090/variadic-macro-replacement