extern non significa "variabile globale", significa che vai a *dichiarare* (e non definire) una variabile che è definita in seguito o addirittura in altro modulo oggetto.

Le variabili statiche di fatto sono delle variabili globali con scope ridotto alla funzione. In generale, più lo scope di una variabile è ridotto, meno casini ci sono, dato che solo le parti del codice pertinenti con essa vi possono accedere.
Proprio per questo motivo l'uso delle variabili globali è sconsigliato; d'altra parte, è bene anche evitare di usare le static, dato che rendono il codice non rientrante e non thread-safe.