как использовать # if, # else, # endif ... внутри макроса c - PullRequest
8 голосов
/ 10 мая 2011
 #include < iostream >  

 #define MY_CHK_DEF(flag) \
 #ifdef (flag) \
    std::cout<<#flag<<std::endl; \
 #else \
    std::cout<<#flag<<" ,flag not define"<<std::endl; \
 #endif 


 int main()
 {
    MY_CHK_DEF(FLAG_1);
    MY_CHK_DEF(FLAG_2);
    MY_CHK_DEF(FLAG_3);
    ...  
 }

отчет о соответствии:

main.cpp: 3: 24: ошибка: '#' не сопровождается параметром макроса

есть идеи?

Спасибо

Ответы [ 4 ]

8 голосов
/ 10 мая 2011

Вы не можете сделать это. #if, #else и #endif должны быть первыми токенами в логической строке. Ваше определение - это всего лишь одна логическая строка, поэтому она не работает,

6 голосов
/ 10 мая 2011

Вы должны сделать это наоборот (определить макрос для каждого условия # if / # ifdef / # else (если вы вкладываете, вы должны поместить определение в каждую ветвь). Вы, вероятно, должны определять его в каждойветвь или он не сможет скомпилироваться, когда вы попытаетесь отрегулировать редко настраиваемый флаг.флаг включен, или ваша программа может работать неправильно.

 #define N(x) 

 #include < iostream > 

 #ifdef (flag) 
 #define MY_CHK_DEF(flag) 
    std::cout<<#flag<<std::endl; 
 #else 
 #define MY_CHK_DEF(flag) \
    std::cout<<#flag<<" ,flag not define"<<std::endl;
 #endif 


 int main()
 {
    MY_CHK_DEF(FLAG_1);
    MY_CHK_DEF(FLAG_2);
    MY_CHK_DEF(FLAG_3);
    ...  
 }
2 голосов
/ 10 мая 2011

Препроцессор C является однопроходным, и #define создает довольно глупую замену, которая не обрабатывается дальше - ваш макрос MY_CHK_DEF (flag) вставляет встроенный оператор #if в предварительно обработанный код, который интерпретируется компилятором C и не является допустимым C.

Вы можете перефразировать его как однопроходный или, если не можете, запустить препроцессор дважды, вручную - один раз через cpp -P и второй раз при обычном процессе компиляции.

0 голосов
/ 22 июня 2013

Вы на самом деле можете сделать это, если используете библиотеку заголовков процессора BOOST .. она предоставляет макрос BOOST_PP_IF, позволяющий принимать решения такого типа.

http://www.boost.org/doc/libs/1_53_0/libs/preprocessor/doc/ref/if.html

...