I am unable to understand why this doesn't work.
extern int i;
int main()
{
  printf(" %d ", i);  
}
static int i =3;
Also, this doesn't work:
extern int i;
static int i =3;
int main()
{
  printf(" %d ", i);  
}
But if static variable is defined before the extern declaration it works:
static int i =3;
extern int i;
int main()
{
  printf(" %d ", i);  
}
As I understand from extern int itells that i is present somewhere else and here how it looks lik(int i)
But, somewhere else means:
1)   Maybe, later point in the same translation unit as a global variable.
2)   Maybe, in some other translational unit.
I was thinking that (1) would be valid even though static int i = 3 has restricted i's scope to the current translation unit where it is defined. 
Isn't static int i =3 global( i mean atleast it is visible in the translation unit) here even though it has the restricted scope to its translation unit? Then why isn't compiler unable to find it?
When I compile the first two versions I get the following compile time error:
 error: static declaration of ‘i’ follows non-static declaration
 note: previous declaration of ‘i’ was here
I am unable to understand this error message. Also, why it is complaining it as a static declaration isn't it a definition also?
 
     
     
    