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.
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.
Explanation: False, The scope of macros is globals and functions.
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.
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.
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; }
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With