【初心者お断り】ガチ規格準拠C専用スレ Part133

このエントリーをはてなブックマークに追加
133デフォルトの名無しさん
http://pc11.2ch.net/test/read.cgi/tech/1206196600/637

の件なんですが、こういうことに出くわした場合、
コンパイラはどういう風に振舞わなければならないとなってるのでしょうか?
それとも未定義?
134デフォルトの名無しさん:2008/04/23(水) 20:55:12
>>133
未定義
コンパイラの実装依存です
リンカのオプションでエラーにする設定もおそらくあります

src1.c と src2.c で変数 a の型が違ってたりすると悲惨です
135デフォルトの名無しさん:2008/04/23(水) 21:01:07
C の仮定義ってファイルまたぐと適用外だっけ?
136デフォルトの名無しさん:2008/04/23(水) 22:13:29
>>134
未定義と実装依存は違うし、そもそもコンパイラにとっては正しいソース
なので、

> コンパイラはどういう風に振舞わなければならないとなってるのでしょうか?

普通に振舞うだけ。

大抵の環境ではリンカでエラーになるはず。
(そのスレでは、エラーにならないと言い張ってるが。)
137デフォルトの名無しさん:2008/04/23(水) 22:19:34
>>136
未定義なので実装依存と書けばいいの?
gcc なら警告無し
borland C++ compiler なら警告あり

大抵の環境って何が基準?
138デフォルトの名無しさん:2008/04/23(水) 22:30:12
VC++2008でも警告無しだな
139デフォルトの名無しさん:2008/04/23(水) 22:31:34
みんなあんまり適当な事言うなよ?

>>133
あまり知られていないが、これは 「仮定義(tentative definition)」 という仕様。
extern も static もついていない、初期化を伴わないグローバル変数の宣言は 「仮定義」 と見なされる。
対する、extern も static もついていない、初期化を伴うグローバル変数の宣言は 「外部定義(external definition)」 と見なされる。

外部定義は必ず実体定義を伴う。
外部定義が複数あると、二重定義となりエラーとなる。

しかし、仮定義は他に実体定義がなければ実体を定義し、
他に実体定義があれば実体定義を伴わない単なる宣言と見なされる。
複数の仮定義を書いた場合、実体は1つだけ定義され、それらの仮定義は実体を共有する。

つまり、>>133 は仕様。