- ベストアンサー
Borland C++ Compiler 5.5の警告について
Borland C++ Compiler 5.5を使用してコンパイルしているのですが、 下記のソースをコンパイルするとエラーがでます。 #include <stdio.h> ------test.c------ int main(void) { int a; int b=0; b = a; return 0; } 警告 W8004 error.c 6: 'b' に代入した値は使われていない(関数 main )という警告なのですが、初期化をしている変数すべての警告がでてしまい困っています。 この警告だけを表示させない方法等あるのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>この警告だけを表示させない方法等あるのでしょうか? 正しい消し方は「宣言と初期化だけ行って、その後、1回も使ってない変数は、宣言そのものをやめる」と「代入しただけで、その後、1回も使ってない変数は、代入そのものをやめる」です。 この警告は b = a; としてbに値を代入した後、一度も使わずに return 0; しているのが原因です。 また、 int b=0; として初期化した後、初期化した値を一度も使わずに b = a; として代入を行い、初期化が無駄になっているのも警告の対象になります。 ですので、警告の根本原因を消すには int main(void) { int a; int b=0; func(b); //ここでbが参照され、初期化が無駄にならない b = a; func(b); //ここでbがもう一度参照され、代入が無駄にならない return 0; } のように「初期化したら、初期化した値を使う」「代入したら、代入した値を使う」と、警告が出なくなります。 もし「使う予定が無い」なら、以下のように「初期化も代入もしない」ようにしましょう。 int main(void) { int a; int b; return 0; } 但し、これでは「宣言された変数aは使用されていない」と言う警告が出るので、更に「宣言そのものも削る」必要があるので int main(void) { return 0; } と書かなくてはいけません。これが「正しい答え」です。 なお、蛇足ですが int main(void) { int a; int b=0; func(b); //ここでbが参照され、初期化が無駄にならない b = a; func(b); //ここでbがもう一度参照され、代入が無駄にならない return 0; } と書いた場合「変数aは、未初期化のまま参照されている」と言う警告が出る場合があります。なので、ちゃんと初期化を行い int main(void) { int a=0; int b=0; func(b); //ここでbが参照され、初期化が無駄にならない b = a; func(b); //ここでbがもう一度参照され、代入が無駄にならない return 0; } と書かないとなりません。 鉄則は ・初期化したなら、代入して値を上書きする前に、値を参照すべし! ・初期化したなら、関数から抜けてreturnする前に、値を参照すべし! ・代入したなら、再代入して値を上書きする前に、値を参照すべし! ・代入したなら、関数から抜けてreturnする前に、値を参照すべし! ・参照するなら、その前に初期化か代入をすべし! ・初期化だけ、代入だけして、参照しないなら、ハナから宣言なんかするな! です。 ぶっちゃけ、貴方のプログラムから警告を消すには int main(void) { return 0; } と書くしかありません。
その他の回答 (4)
- S117
- ベストアンサー率40% (18/45)
C99やC++であれば、 初期化してる部分で変数を宣言するのがもっともいい方法です。 int a=10; /* その他の処理 */ int b=a; ただし、CだとC99からの機能なのでVisual Cなどで使えないです。 まぁ、一般的にはそういう警告を出すコンパイラなら、未初期化変数の使用も警告してくれますので、無意味な初期化を消せばいいでしょう。 ちなみに、Visual Cだと初期化すると変数が使われたと認識されて、それ以降で変数の参照がない場合(要するに使っていない変数)でも警告してくれないので、移行しても無意味な初期化にはやはり問題があります。
- hidebun
- ベストアンサー率50% (92/181)
先頭に、 # pragma warn -8004 とでもすれば、警告は消えると思いますが、 他の方がおっしゃられているように、警告の原因を消すのが一番です。 後々、何のために宣言した変数だったかわからなくなりますので。
- asuncion
- ベストアンサー率33% (2127/6289)
>初期化をしている変数すべての警告がでてしまい困っています。 困らないようにするには、当該コードのような無意味な初期化をしないようにするのがいちばんです。
- baonhieu
- ベストアンサー率19% (7/36)
bcc32 -w- test.c として警告を表示させないか、無意味な処理はコメントアウトでしょう。 Visual Studio 2008に移行したほうがいいのでは。
お礼
ご丁寧なご回答頂きありがとうございます! なるほど・・・、参照するかどうかで警告を出していたのですね。 代入(初期化)と参照を対で行うというのがポイントのようですね。 とても勉強になりました!ありがとうございます。