dポイントプレゼントキャンペーン実施中!

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 )という警告なのですが、初期化をしている変数すべての警告がでてしまい困っています。
この警告だけを表示させない方法等あるのでしょうか?

A 回答 (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;
}
と書くしかありません。
    • good
    • 0
この回答へのお礼

ご丁寧なご回答頂きありがとうございます!
なるほど・・・、参照するかどうかで警告を出していたのですね。
代入(初期化)と参照を対で行うというのがポイントのようですね。
とても勉強になりました!ありがとうございます。

お礼日時:2009/03/16 23:13

C99やC++であれば、


初期化してる部分で変数を宣言するのがもっともいい方法です。

int a=10;
/* その他の処理 */
int b=a;

ただし、CだとC99からの機能なのでVisual Cなどで使えないです。

まぁ、一般的にはそういう警告を出すコンパイラなら、未初期化変数の使用も警告してくれますので、無意味な初期化を消せばいいでしょう。

ちなみに、Visual Cだと初期化すると変数が使われたと認識されて、それ以降で変数の参照がない場合(要するに使っていない変数)でも警告してくれないので、移行しても無意味な初期化にはやはり問題があります。
    • good
    • 0

先頭に、


# pragma warn -8004
とでもすれば、警告は消えると思いますが、
他の方がおっしゃられているように、警告の原因を消すのが一番です。
後々、何のために宣言した変数だったかわからなくなりますので。
    • good
    • 0

>初期化をしている変数すべての警告がでてしまい困っています。



困らないようにするには、当該コードのような無意味な初期化をしないようにするのがいちばんです。
    • good
    • 0

bcc32 -w- test.c


として警告を表示させないか、無意味な処理はコメントアウトでしょう。
Visual Studio 2008に移行したほうがいいのでは。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!