えー、一応管理人としては何か言うべきところなんでしょうが、正直、
私にはわかりません。
>6.9.2 外部オブジェクト定義 例1(抜粋)
>
>static int i2 = 2; // 定義,内部結合
> int i2 ; // 前に内部結合をもつ定義があるため、
> // 結合の不一致が生じ、6.2.2によって
> // 動作は未定義となる
>extern int i2 ; // 内部結合をもつ前の定義を参照する
この「extern int i2;」の挙動が不可解だということですよね。
私にも不可解に見えます。そもそもキーワードの名前が「extern(al)」なのに!
Rationaleを見ても、このへんに関する記述は以下の箇所くらいのようです。
http://www.lysator.liu.se/c/rat/c1.html#3-1-2-2
これはこれで興味深いのですが(最初期のCではexternはあってもなくても同じだった
らしい)、yuyaさんの疑問の回答にはならないように思います。
Relaxed Ref/Defモデルのところには、
| The appearance of the keyword extern (whether it is used outside of the
| scope of a function or not) in a declaration indicates a pure reference
| (ref), which does not define storage.
(超訳)
>externはどっかの定義の参照を意味し、記憶領域の定義ではない。
とあるので、そのモデル(UNIX Cのモデル)を引き継ぐとそういう考え方になるのかなあ、
と思いましたが… UNIX Cにおいてexternが内部結合の定義を参照するような
実装があったのでしょうか。
externは定義にはならない、と考えると
extern int i3 = 3;
これも不可解ですが、これはcommonモデルの方を引き継いだのでしょうかね。