Scope of #define preprocessor in C

When you have preprocessor question:

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


The C preprocessor runs through the file top-to-bottom and treats #define statements like a glorified copy-and-paste operation. Once it encounters the line #define pi 3.14, it starts replacing every instance of the word pi with 3.14. The pre-processor does not process (or even notice) C-language scoping mechanisms like parenthesis and curly braces. Once it sees a #define, that definition is in effect until either the end of the file is reached, the macro is un-defined with #undef, or (as in this case) the macro is re-defined with another #define statement.

If you are wanting constants that obey the C scoping rules, I suggest using something more on the lines of const float pi = 3.14;.


The scope of a #define is from the occurrence, to the end of the file (or a corresponding #undef), regardless of any intervening C scopes.


Preprocessor has no concept of "scope" -- it manipulates the text of the program, without any idea of what the text is

Symbol is defined from its definition until the end of the compilation unit (a source file and and files it includes)