あえて言っちゃうと規格がバカ!
Cでは宣言文と定義文が分かれていないと初期のころから不思議がられていた。
で、上の「char a[6];」のみで「=」無しのやつなんかは、規格の6.9.2で、
仮定義(tentative definition)と、仮なんて無理やりな言葉で誤魔化した。
真の定義じゃないから、関数の外で「char a[6]; char a[6];」なんて複数仮定義してもOKだし、
もちろん、「extern char a[6]; static char a[6];」なんて仮定義しても警告すら出ん。
規格では「extern」は内部結合でもいいよと書かれているが、字面じゃ完璧エラーだろ。