2010-04-19 2 views
9

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

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

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

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

ответ

11

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

15

Макросы, да. Препроцессора директивы, которые не то, что вы в курсе, не

2

Нет, я ответил на этот c++ macros with memory?

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

4

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

Смежные вопросы