Объем препроцессора #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 (есть ли опечатка на выходе вашей программы?).