K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>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()の中での宣言とのチェックも行っていて、そのためにエラーになった。 > >ということでしょうかね。 >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!