大域識別子の宣言・定義について教えてください。
通常、
extern int i;
のようにすると、それは宣言と見なされてインスタンスは作成されませんよね。
ところが
extern int i = 1;
のように書くと、インスタンスが作成され1で初期化されます。
ということで、externが付いても初期化がされているものは、externが
無視されるのだろうと、かってに自分を納得させていました。ところが
int i;
extern int i = 1;
という定義の重複と思われるコードをコンパイルしてみると、エラーは出ず
実行したらiが1で初期化されていました。はて?と思い、今度は前後を変えて
extern int i = 1;
int i;
でコンパイルしてみると、iの再定義ということでコンパイルエラーになりました。
これらの現象から帰納すると、どういうことになるんでしょうか。
単にコンパイラがおかしいのでしょうか。ちなみにVC++ 2008 Expressです。