Область применения #define препроцессора в C - PullRequest
12 голосов
/ 17 июня 2011

Область действия #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

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

Ответы [ 5 ]

21 голосов
/ 17 июня 2011

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

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

6 голосов
/ 17 июня 2011

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

1 голос
/ 17 июня 2011

Если у вас есть вопрос препроцессора:

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

1 голос
/ 17 июня 2011

Препроцессор не имеет понятия «область действия» - он манипулирует текстом программы, не имея представления о том, что это за текст

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

0 голосов
/ 17 июня 2011

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

...