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.
