Вы не можете использовать директивы препроцессора в макрос, но если мы хотим, чтобы проверить, если 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