как использовать #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