K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>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; と解釈しません。 >>そのへん関数宣言と変数宣言で文法が違う場所です。 > >なるほど。理解できました。 >ご丁寧な解説、ありがとうございます。 >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!