[207] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25
774RRさん、度々申し訳ありません。
>リンク先の12番の解説を文字通りに解釈してください。
>仮定義(初期化子なし定義)だけがあって、初期化子あり定義が無い場合、
>翻訳単位のEOFに達した時点で仮定義は定義となります。
>--hoge.c--
>int x; // 仮定義
>int x; // 仮定義:何回仮定義が現れても(既存の宣言に反しない限り)問題ない
>int x; // 仮定義
>--EOF of hoge.c--
>この時点で int x=0; と定義されたことになる。
>
>>上記の場合だと、b.cのint a;が仮定義なので、
>この文章はある意味YES、ある意味NO。確かに int a; は仮定義ですが、既に述べたとおり
>翻訳単位 (b.c) の EOF に達した時点で、仮定義は「仮ではない『定義』」になります。
>よって提示の例では a.c b.c ともに変数 a が定義されています。
>そこではじめてリンク先13番目の解説が効いてきます。
>
>>a.cで定義されているint a = 1;のオブジェクトとまとめられたと言うことで
>「仮定義だからまとめられた」のではありません。
>「C では、定義が複数ある場合の挙動が定められていない」(未定義動作)
>→「エラーにするのも、定義を1つにまとめるのも処理系の実装次第」
>→→「多くの C 処理系では定義を1つにまとめちゃう」
>となっただけです。
>
>>b.cのint a;がextern int a;と解釈されている訳ではないという解釈で宜しいでしょうか?
>コンパイラは int a; を勝手に extern int a; と解釈しません。
>そのへん関数宣言と変数宣言で文法が違う場所です。
なるほど。理解できました。
ご丁寧な解説、ありがとうございます。