как использовать #if,#else,#endif... внутри макроса c

 #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);
    ...  
 }

complier report:

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

какие идеи?

спасибо

4 ответов


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


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

 #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);
    ...  
 }

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

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


ты на самом деле can сделайте это, если вы используете BOOST processor header lib.. он предоставляет макрос BOOST_PP_IF, позволяющий этот тип решений.

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