[1044] Re:externと「外部結合」
投稿者:yuya
2007/08/31 10:38:45
774RRさん、ありがとうございます。
0. C限定の話です。
1. はい、ご紹介くださったものと同じものを入手しています(保存も……)。
2. 変数のextern宣言について[1043]で成り立つことは、
関数原型宣言(externをつけてもつけなくても同じですが)についても成り立つと思うので、関数も含む話です。
3. 処理系準拠限定の話です。[1043]の末尾の非準拠の話は、歴史的経緯の手がかりになるかも、と思って付け加えました。
で、この議論に関係する条項は
JISX3010:2003 6.2.2 識別子の結合
6.9 外部定義(とくに 6.9.2 外部オブジェクト定義)
になると思います。
[1043]の投稿は、[1025]に774RRさんが書かれた
> extern の意味するところは[1020]で書いたとおり、結合指定
> (略)
> 厳密なところは自分で JIS 言語規格書を参照してもらうとして、簡単に言うなら
> extern:外部結合を指定、static:内部結合を指定
というところを読んで、その意味を考えたのがきっかけです。
確かに6.2.2にはextern宣言された識別子の結合が場合分けされて書かれていますが、
よく読むと回りの定義状況に合わせた定まり方になっており、私には(ごく自然な) *結果* と映ります。
だとすると、extern宣言はどんな「結合指定」を担っているのだろう?と疑問に思ったのです。
特に、初期化子のない外部(ブロック外)変数定義・宣言の場合、
externをつけないほうがむしろ積極的に「外部結合」を指定しているように思います。
内容は前回の繰り返しになりますが、規格書で言えば
6.9.2 外部オブジェクト定義 例1(抜粋)
static int i2 = 2; // 定義,内部結合
int i2 ; // 前に内部結合をもつ定義があるため、
// 結合の不一致が生じ、6.2.2によって
// 動作は未定義となる
extern int i2 ; // 内部結合をもつ前の定義を参照する
が該当します。