K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>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 ; // 内部結合をもつ前の定義を参照する > >が該当します。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!