I would take exception to your statement that extern int i; and int i; are equivalent, in that the first declaration reserves no storage for the variable 'i', while the second declaration does reserve storage for the variable 'i'. The extern declaration tells the compiler that storage for the variable 'i' will be allocated in another module.