Может ли кто-нибудь объяснить область действия c-макроса, определенного локально для функции и глобального?

#c

#c

Вопрос:

Я не знаю, почему появляется этот вывод и поведение препроцессора.

Вывод:

 the value in main 10
the value in fun 20
the value in 2 main 10
 

Источник

 #include<stdio.h>
#define MAX 10

int fun(int a);

int main()
{
    int a;
    a=MAX;
    printf("the value in main =%dn",a);
    fun(a);
    int b;
    b=MAX;
    printf("the value in 2 main =%dn",b);    /*<----doubt at this line*/
}
 

Что происходит, когда мы присваиваем новое значение макросу внутри локальной функции, почему он не обновляется вне функции?

 int fun(int a)
{
#undef MAX
#define MAX 20
    a=MAX;
    printf("the value in 2 main =%dn",a);
}
 

Комментарии:

1. Это все в одном файле? Каков порядок main и fun в файле?

2. Не ясно, в чем ваша проблема. Возможно, вы захотите прочитать, что такое макросы и как работают предварительные процессоры. Подсказка: у него нет понятия области действия.

3. да, все в одном файле только в main() я вызываю fun().

Ответ №1:

Макрос не проверяется во время выполнения. Он проверяется во время компиляции перед компиляцией на этапе, называемом предварительной обработкой.

Итак, компилятор main сначала обрабатывает функцию и заменяет MAX на 10 во всех строках. Затем, когда он достигает fun функции, он отменяет MAX и переопределяет ее на 20 и заменяет строки на fun 20.

Комментарии:

1. …и использует значение 20 for MAX во всех последующих строках модуля компиляции.

2. но в функции я меняю значение MAX. почему это не отражение в main после переопределения в функции? максимальное значение заменяется новым значением wright?

3. Как я уже сказал, макрос не заменяется во время выполнения. Это означает, что он следует не за выполнением программы, а за порядком, в котором макросы определены в файле. Чтобы увидеть это, вы можете написать fun функцию над main, но ниже #define MAX 10 . В этом случае все операторы printf будут иметь значение 20.

Ответ №2:

Конечно, вы написали код для функции fun после основной.

Компилятор изменяет определенные макросы для соответствующих значений в том порядке, в котором он их находит в исходном коде, а не в порядке выполнения.