Rohit Jain
Rohit Jain

Reputation: 831

Scope of #define preprocessor in C

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.141516

Considering preprocessing for main the value of pi should be 3.141516 and outside main 3.14. This is incorrect but please explain why.

Upvotes: 28

Views: 31276

Answers (6)

antlersoft
antlersoft

Reputation: 14786

The preprocessor doesn't have any concept of "scope"—it manipulates the text of the program, without any idea of what the text is.

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

Upvotes: 1

Yousuf
Yousuf

Reputation: 183

Here is what it roughly looks like after the preprocessor is done with your file:

 void fun();
 int main()
 {
    printf("%f \n",3.14);

    fun();
    return 0;
 }
 void fun(){
 printf("%f \n",3.141516);}

These are the lines that go to the compiler for compilation (I discarded much of the code for the sake of clarity, only kept what you coded). As the preprocessor replaces the #define directive with the text/value you provided, thus you don't see the #define directives anymore after preprocessing. So it is clear what is going to be printed on the console/terminal.

Upvotes: 1

Jim Lewis
Jim Lewis

Reputation: 45045

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.

Upvotes: 11

jman
jman

Reputation: 11606

When you have preprocessor question:

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

Upvotes: 4

bta
bta

Reputation: 45057

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;.

Upvotes: 30

Chris Frederick
Chris Frederick

Reputation: 5584

As far as I know, the preprocessor uses #define statements in the order that it encounters them. In that case, your first printf statement correctly prints 3.14 and the second 3.141516 (is there a typo in the output from your program?).

Upvotes: 0

Related Questions