Por que a classe de armazenamento 'externo' funciona de maneira diferente nas funções?

O trecho a seguir funciona bem

extern int i;
int i;

int main(){
    return 0;
}

Aqui o que eu obtive é: 'i' é declarado e depois definido. Como existe apenas uma definição, isso é perfeitamente adequado.

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

Agora, o exemplo acima fornece o seguinte erro

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;

Qual é o problema aqui? Aqui também há uma definição única de 'i'.

questionAnswers(2)

yourAnswerToTheQuestion