>>8
C だと int i; が仮定義 (tentative definition) とかいう扱いになって、
コンパイル〜リンクできるはず。

C++ だと、 extern が付いてない int i; も、初期化子が付いてる extern int i = 1; も
両方とも(仮ではない)定義とみなされる(規格の 3.1 Declarations and definitions p2 )ので、
定義が重複していることになり、 ODR 違反で未定義動作になる。(規格の 3.2 One definition rule )

g++ 3.4.4 では、並べて書くと redefinition of `int i' というエラーになった。別々の
ファイルに分けて書けばリンクエラーになると思う。 VC は、 C と同じ動作になってる
・・・と思ったけど順番変えてエラーになるのは意味が分からんな。

まぁ未定義動作なんてこんなもんだろ。