Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scope of macros in C?

How these macros are evaluated?

# define i 20 void fun();  int main(){   printf("%d",i);   fun();   printf("%d",i);   return 0; }  void fun(){   #undef i   #define i 30 } 

gives output as 2020 but whereas,

# define i 20 void fun(){   #undef i   #define i 30 }  int main(){   printf("%d",i);   fun();   printf("%d",i);   return 0; } 

gives output as 3030. Please Explain. Thanks.

like image 793
Vishnu Prasath Avatar asked Jun 27 '13 17:06

Vishnu Prasath


People also ask

What is the scope of a macro?

A macro variable's scope determines how it is assigned values and how the macro processor resolves references to it. Two types of scopes exist for macro variables: global and local.

Does macros have a local scope?

Explanation: False, The scope of macros is globals and functions.

What is the use of macros in C?

Macro in C programming is known as the piece of code defined with the help of the #define directive. Macros in C are very useful at multiple places to replace the piece of code with a single value of the macro. Macros have multiple types and there are some predefined macros as well.

What is the scope of #define in C?

ANSWER. #define is a preprocessor directive that allows you to specify a name and replacement text. As the preprocessor parses the source file, each occurrence of the name is replaces by its associated text. The scope of #define is limited to the file in which it is defined.


2 Answers

C Preprocessor works top to bottom irrespective of function calls. It is effective from that point (line) in whatever the file that macro is defined, until corresponding undef or till end of the translation unit.

So, your code would become,

# define i 20                // from now on, all token i should become 20 void fun(); int main() {   printf("%d",i);   // printf("%d",20);   fun();   printf("%d",i);   // printf("%d",20);   return 0; } void fun() { #undef i               // from now on, forget token i #define i 30               // from now on, all token i should become 30 } 

Your second code would become,

# define i 20                // from now on, all token i should become 20 void fun() { #undef i                // from now on, forget i #define i 30                // from now on, all token i should become 30 } int main() {   printf("%d",i);    //  printf("%d",30);   fun();   printf("%d",i);    // printf("%d",30);   return 0; } 
like image 176
VoidPointer Avatar answered Oct 10 '22 19:10

VoidPointer


There's no scope involved at all. Macros are handled at the preprocessing stage separately and independently from the compilation stage and have no concept of a C scope. Your examples could just as easily be:

#define i 20  void fun();  int main() {   printf("%d",i);   fun();   printf("%d",i);   return 0; }  void fun() { }  #undef i #define i 30 

And:

#define i 20 #undef i #define i 30  void fun() { }  int main() {   printf("%d",i);   fun();   printf("%d",i);   return 0; } 

You can see from those why it behaves the way it does.

like image 34
Carl Norum Avatar answered Oct 10 '22 19:10

Carl Norum