Macro on variable initialization in C.
#define abcd
char abcd c[] = "AJITH";
for(i=0;i<5;i++){
printf("%c",c[i]);
}
output:- AJITH
Why didn't compiler show an error? What does it mean?
Macro on variable initialization in C.
#define abcd
char abcd c[] = "AJITH";
for(i=0;i<5;i++){
printf("%c",c[i]);
}
output:- AJITH
Why didn't compiler show an error? What does it mean?
Since the #define
has no replacement text for abcd
, any occurrence of abcd
will basically be removed by the preprocessor, so
char abcd c[] = "AJITH";
becomes
char c[] = "AJITH";
abcd
is expanded to blank.
so char abcd c[] = "AJITH"
is expanded to char c[] = "AJITH"
, which is perfectly fine.
Below is the output of your program only after preprocessing (gcc -E)
char c[] = "AJITH";
int i;
for(i=0;i<5;i++){
printf("%c",c[i]);
}
In the statement
#define abcd
there is no macro-body
for macro-name
. So it will replace macro-name
with nothing.
After preprocessor stage your below code
#define abcd
int main(void) {
char abcd c[] = "AJITH";
for(int i=0;i<5;i++){
printf("%c",c[i]);
}
return 0;
}
looks like this
int main(void) {
char c[] = "AJITH";
for(int i=0;i<5;i++){
printf("%c",c[i]);
}
return 0;
}
Hence it prints AJITH
why didn't compiler shows the error? This #define abcd
is a empty string & empty define are allowed according to C standard.
From C11 standard (n1570), ยง 6.10 Preprocessing directives
control-line:
# define identifier replacement-list new-line # define identifier lparen identifier-list(opt) ) replacement-list new-line # define identifier lparen ... ) replacement-list new-line # define identifier lparen identifier-list , ... ) replacement-list new-line replacement-list: pp-tokens(opt)
As you can see above the replacement-list:
and which is list of tokens & that can be empty.