Макросы в макросах - PullRequest
       41

Макросы в макросах

11 голосов
/ 19 апреля 2010

Можно ли поместить макрос в макрос в c ++?

Что-то вроде:

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

Я пытался, и это не сработало, так что я думаю, что это не сработает, разве есть какой-то синтаксис, который может это исправить?

Ответы [ 4 ]

16 голосов
/ 19 апреля 2010

Макросы, да. Директивы препроцессора, которые вы опубликовали, нет

11 голосов
/ 19 апреля 2010

Нет, но вы можете просто изменить его, вытянув #ifdef в качестве верхнего уровня и используя две разные версии #define Something ... для истинных и ложных ветвей #ifdef.

4 голосов
/ 16 января 2012

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

2 голосов
/ 19 апреля 2010

Нет. Я ответил на это в c ++ макросах с памятью?

Если вы хотите проверить или изменить среду предварительной обработки, другими словами, чтобы определить подпрограмму предварительной обработки, а не макрос замены строки, вам нужно использовать заголовок, хотя законные причины для этого немногочисленны.

...