K.Maebashi's BBS 管理者削除

以下の投稿を削除します。

[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; と解釈しません。 そのへん関数宣言と変数宣言で文法が違う場所です。

代替メッセージ

物理削除     パスワード: