#c #if-statement #macros #conditional-statements
#c #if-оператор #макросы #условные операторы
Вопрос:
#define TEST
int i = 1;
int main(int argc, char const *argv[]) {
#if (defined(TEST) amp;amp; i)
printf("it is printed");
#endif
return 0;
}
Должен ли я создавать другой макрос для i
?
Комментарии:
1. Вы не можете. Директивы препроцессора оцениваются во время компиляции, переменные в это время недоступны.
2. «Должен ли я создать другой макрос для i?» Да.
i
должен быть макрос, который в конечном итоге преобразуется в целочисленную константу препроцессора, чтобы его можно было использовать в#if
условных выражениях.3. Можете ли вы использовать
if (i)
вместо того, чтобы помещать это в макрос?4. Какую актуальную проблему вам нужно решить? В чем причина этого вопроса? Прямо сейчас это проблема XY .
Ответ №1:
Если вам нужен вывод тогда и только тогда, когда и макрос, и условие для глобальной переменной истинны, тогда сделайте так:
#if (defined(TEST))
if (i)
{ printf("it is printed");
}
#endif
Причина (согласие с комментарием Бармара):
Директивы препроцессора оцениваются во время компиляции, переменные в это время недоступны.
Комментарии:
1. Предварительная обработка выполняется перед фактической компиляцией кода на C
2. @P__J__ True. К чему вы клоните? Вы хотите обсудить (теоретическую) разницу между временем препроцессора и временем компиляции?
Ответ №2:
Как и в комментариях, определения макросов расширяются на этапе предварительной обработки, перед фактической компиляцией кода C.
Но почему этот код компилируется и каков будет его результат.
#if (defined(TEST) amp;amp; i)
- препроцессор проверяет определение макросов
TEST
. Как было определено, результат этой проверкиtrue
- теперь препроцессор проверяет, является ли определение макроса (не переменной C!)
i
существует. Поскольку этого не происходит, все выражение в#if
вычисляетсяfalse
как .
Обычно :
#if a
проверяет, существует ли определение макроса a
, а затем, является ли его значение != 0
,