Объем препроцессора #define в C

Объем #define до конца файла. Но с чего это начинается. В основном я попробовал следующий код.

 #include<stdio.h>
 #include<stdlib.h>
 #define pi 3.14
 void fun();
 int main()
{
 printf("%f \n",pi);
 #define pi 3.141516
    fun();
return 0;
}
void fun(){
printf("%f \n",pi);}

Вывод вышеуказанной программы выходит

3.140000
3.141416

С учетом предварительной обработки для основного значения pi должно быть 3.141516 и снаружи основной 3.14. Это неверно, но, пожалуйста, объясните, почему.

Ответ 1

Препроцессор C запускается через файл сверху вниз и обрабатывает операторы #define, такие как прославленная операция копирования и вставки. Когда он встречает строку #define pi 3.14, он начинает заменять каждый экземпляр слова pi на 3.14. Препроцессор не обрабатывает (или даже не замечает) механизмы определения языка C, такие как скобки и фигурные скобки. Когда он увидит #define, это определение действует до тех пор, пока не будет достигнут конец файла, макрос не определен с помощью #undef или (как в этом случае) макрос переопределяется с помощью другого #define.

Если вам нужны константы, которые подчиняются правилам C-области, я предлагаю использовать что-то большее в строках const float pi = 3.14;.

Ответ 2

Объем #define от вхождения до конца файла, независимо от каких-либо промежуточных областей C.

Ответ 3

Препроцессор не имеет понятия "scope" - он манипулирует текстом программы, не зная, что текст

Символ определяется из его определения до конца блока компиляции (исходный файл и его файлы)

Ответ 4

Когда у вас есть вопрос о препроцессоре:

gcc -E foo.c > foo.i; vim foo.i

Ответ 5

Насколько я знаю, препроцессор использует операторы #define в том порядке, в котором он встречается с ними. В этом случае ваш первый оператор printf корректно печатает 3.14, а второй 3.141516 (есть ли опечатка на выходе вашей программы?).