¿Por qué la clase de almacenamiento 'externo' funciona de manera diferente en las funciones?

El siguiente fragmento funciona bien

extern int i;
int i;

int main(){
    return 0;
}

Aquí lo que obtuve es, 'i' se declara y luego se define. Dado que solo hay una definición, eso está perfectamente bien.

int main(){
    extern int i;
    int i;
    return 0;
}

Ahora, el anterior da el siguiente error

new.cpp: In function ‘int main()’:
new.cpp:5:6: error: redeclaration of ‘int i’
  int i;
      ^
new.cpp:4:13: note: previous declaration ‘int i’
  extern int i;

¿Cuál es el problema aquí? Aquí también hay una definición única de 'i'.

Respuestas a la pregunta(2)

Su respuesta a la pregunta