[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()の中での宣言とのチェックも行っていて、そのためにエラーになった。
ということでしょうかね。