K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[211] Re:C言語ポインタ完全制覇についての質問
投稿者:(ぱ)
2007/02/20 02:13:25

>C++ 規格書であれば 「JIS X3014:1998-3.3.2 局所的な有効範囲」で、 >ブロック内に宣言された名前はそのブロックに局所的である。 >と書かれています。実際以下のコードはコンパイルエラーです。 C でも、6.1.2.1 を見る限り、ブロック内で宣言された識別子のスコープは ブロック内ですから、プロトタイプ宣言もブロック内だけで有効と考えるのが 自然なように思います。 ただ、ふたつのコンパイラで、単純にそうとは言えない動きをしているので、 どこか別に規定があるのかと、昨晩は規格書をひっくり返していたのでした。 >んで、上記を hoge.c とした場合の挙動ですが >bash-3.0$ hppa2.0w-hp-hpux11.00-gcc-3.3.4 -Wall -c hoge.c >hoge.c: In function `func2': >hoge.c:7: warning: implicit declaration of function `piyo' これはプロトタイプ宣言がない場合の通常の挙動ですよね。 だから、gccでは、ちゃんとブロックでスコープが終了していて、 C++ではだめなのは、C++ではそもそもプロトタイプ宣言がないことを許さないからで。 bcc32ですが、 extern void piyo(int a); と書いていたのを、 extern int piyo(int a); にしたら通りました。 推測するに、 a)hoge1()の中のpiyoの宣言はhoge1()の中で完結していて、 b)hoge2()の中のpiyoの呼び出しで、宣言がないので暗黙にintを返す関数として  宣言されて、 c)その宣言の段階で、既存の宣言との整合性がチェックされ、なぜかこのときは  hoge1()の中での宣言とのチェックも行っていて、そのためにエラーになった。 ということでしょうかね。
[この投稿を含むスレッドを表示] [この投稿を削除]