[206] Re:C言語ポインタ完全制覇についての質問
投稿者:774RR
2007/02/20 02:13:25
リンク先の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; と解釈しません。
そのへん関数宣言と変数宣言で文法が違う場所です。