【初心者お断り】ガチ規格準拠C専用スレ Part133 at TECH
[2ch|▼Menu]
133:デフォルトの名無しさん
08/04/23 20:00:31
スレリンク(tech板:637番)

の件なんですが、こういうことに出くわした場合、
コンパイラはどういう風に振舞わなければならないとなってるのでしょうか?
それとも未定義?

134:デフォルトの名無しさん
08/04/23 20:55:12
>>133
未定義
コンパイラの実装依存です
リンカのオプションでエラーにする設定もおそらくあります

src1.c と src2.c で変数 a の型が違ってたりすると悲惨です

135:デフォルトの名無しさん
08/04/23 21:01:07
C の仮定義ってファイルまたぐと適用外だっけ?

136:デフォルトの名無しさん
08/04/23 22:13:29
>>134
未定義と実装依存は違うし、そもそもコンパイラにとっては正しいソース
なので、

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

普通に振舞うだけ。

大抵の環境ではリンカでエラーになるはず。
(そのスレでは、エラーにならないと言い張ってるが。)

137:デフォルトの名無しさん
08/04/23 22:19:34
>>136
未定義なので実装依存と書けばいいの?
gcc なら警告無し
borland C++ compiler なら警告あり

大抵の環境って何が基準?

138:デフォルトの名無しさん
08/04/23 22:30:12
VC++2008でも警告無しだな

139:デフォルトの名無しさん
08/04/23 22:31:34
みんなあんまり適当な事言うなよ?

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

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

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

つまり、>>133 は仕様。

140:デフォルトの名無しさん
08/04/23 22:35:35
ちなみにこの仕様は C++ で廃止された。
C++ では仮定義がなくなり、
extern も static もついていない、初期化を伴わないグローバル変数の宣言も
外部定義と見なされ、実体定義を伴う。

このあたりの違いの話は C++ の規格の付録に書いてある。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5396日前に更新/70 KB
担当:undef