The scope of #define
is till the end of the file. But where does it start from.
Basically I tried the following code.
#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);}
The output of the above program comes out to be
3.140000
3.141416
Considering preprocessing for main the value of pi should be 3.141516 and outside main 3.14. This is incorrect but please explain why.
As far as I know, the preprocessor uses
#define
statements in the order that it encounters them. In that case, your firstprintf
statement correctly prints 3.14 and the second 3.141516 (is there a typo in the output from your program?).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)
When you have preprocessor question:
The scope of a
#define
is from the occurrence, to the end of the file, regardless of any intervening C scopes.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 wordpi
with3.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;
.