Как использовать глобальную переменную в условной проверке #if?

#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)
  
  1. препроцессор проверяет определение макросов TEST . Как было определено, результат этой проверки true
  2. теперь препроцессор проверяет, является ли определение макроса (не переменной C!) i существует. Поскольку этого не происходит, все выражение в #if вычисляется false как .

Обычно :

 #if a
  

проверяет, существует ли определение макроса a , а затем, является ли его значение != 0 ,