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 )という警告なのですが、初期化をしている変数すべての警告がでてしまい困っています。
この警告だけを表示させない方法等あるのでしょうか?
No.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;
}
と書くしかありません。
ご丁寧なご回答頂きありがとうございます!
なるほど・・・、参照するかどうかで警告を出していたのですね。
代入(初期化)と参照を対で行うというのがポイントのようですね。
とても勉強になりました!ありがとうございます。
No.4
- 回答日時:
C99やC++であれば、
初期化してる部分で変数を宣言するのがもっともいい方法です。
int a=10;
/* その他の処理 */
int b=a;
ただし、CだとC99からの機能なのでVisual Cなどで使えないです。
まぁ、一般的にはそういう警告を出すコンパイラなら、未初期化変数の使用も警告してくれますので、無意味な初期化を消せばいいでしょう。
ちなみに、Visual Cだと初期化すると変数が使われたと認識されて、それ以降で変数の参照がない場合(要するに使っていない変数)でも警告してくれないので、移行しても無意味な初期化にはやはり問題があります。
No.3
- 回答日時:
先頭に、
# pragma warn -8004
とでもすれば、警告は消えると思いますが、
他の方がおっしゃられているように、警告の原因を消すのが一番です。
後々、何のために宣言した変数だったかわからなくなりますので。
No.1
- 回答日時:
bcc32 -w- test.c
として警告を表示させないか、無意味な処理はコメントアウトでしょう。
Visual Studio 2008に移行したほうがいいのでは。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
だれがとけるの?
-
C言語 アロー演算子について質...
-
テキストボックスの値を変数に...
-
EXCEL/VBA 変数の値をクリップ...
-
C言語 exitで終了した関数の戻...
-
C言語 列挙型(enum型)変数について
-
jsp~jspにhiddenを使って変数...
-
Variant型で宣言してるのにEmpt...
-
Char* に文字列代入
-
プログラミングで変数と関数の...
-
C言語 exitの使い方
-
エクセルのマクロについて教え...
-
○桁にある数値を取得する VB.N...
-
エクセルへのデータの貼付時に...
-
Cプログラムについて
-
正規表現で、英数記号を含むパ...
-
異なる文字列のマッチングを、D...
-
VBAでC列が入力済みならそのま...
-
LOG(10)2の意味は?
-
VisualStudio2022でC言語プログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
EXCEL/VBA 変数の値をクリップ...
-
だれがとけるの?
-
C言語 列挙型(enum型)変数について
-
[VBS]変数を定数に変換する方法...
-
jsp~jspにhiddenを使って変数...
-
Variant型で宣言してるのにEmpt...
-
processing エラーで、 "cannot...
-
テキストボックスの値を変数に...
-
整数xxxが大き過ぎますというエ...
-
C言語 アロー演算子について質...
-
i++と++i ってどう違うのですか?
-
数値計算??
-
python の 連鎖代入の文法
-
インクリメント演算子の前置(+...
-
「%」を使って、偶数か奇数かを...
-
【VBA】複合代入演算子
-
VBA 1行で複数の代入を行った...
-
datagridviewに行...
おすすめ情報