[222] Re:C言語ポインタ完全制覇についての質問
投稿者:九龍
2007/02/20 02:13:25
れぷさんへ。
> a)hoge1()の中のpiyoの宣言はhoge1()の中で完結していて、
> b)hoge2()の中のpiyoの呼び出しで、宣言がないので暗黙にintを返す関数として
> 宣言されて、
> c)その宣言の段階で、既存の宣言との整合性がチェックされ、なぜかこのときは
> hoge1()の中での宣言とのチェックも行っていて、そのためにエラーになった。
なので、
「a)hoge1()の中のpiyoの宣言はhoge1()の中で完結していて、」なのですが、
最終的には、
「c)その宣言の段階で、既存の宣言との整合性がチェックされ、なぜかこのときは
hoge1()の中での宣言とのチェックも行っていて、そのためにエラーになった。 」
となるので、前者の文章は「完結していて」が「完結していない」という結論になります。
(チェックされていればhoge1で完結している事にはなりませんので、(ぱ)さんは完結していないと仰りたかったんだと私は解釈しております。間違ってたらごめんなさい。)
という訳で(私の解釈が正しければ)、bcc32では774RRさんが仰っている
> と思います。C++ と違い C の場合、K&R1 の頃の(いわゆる non-ansi C) との後方互換性を
> 保つため、規格書に書かれていない(もしくは規格書が禁じている)後方互換のための機能が
> いくつも有効になっている処理系がほとんどのようです。
となります。
という訳でして、hoge1()のextern宣言時では「外部関数はグローバルにあると想定するしかない」ですよね。
で、宣言が完結していていない(コンパイラが余計(?)なことをしてくれるため)ため、「外部関数はグローバルにあると想定するしかない」がhoge2にも摘要されるので、れぷさんの仰る通り、
> なので「外部関数はグローバルにあると想定するしかない」→「だから整合チェックがかかるのでは?」と思ったわけです。
となります。
一応念の為に書いておきます。