2009-08-28 16 views
1

変数を宣言して後でプログラムで使用しないと、コンパイラは警告を表示します。警告はありますか?どのようにエラーが発生する可能性がありますか?ありがとう!なぜ宣言されているが使用されていない変数でエラーが発生するのでしょうか?

+0

Sinan:あなたは自分の投稿を編集する能力を持っています。少しの言語のタイプミスについて心配する必要はありません:) –

+0

"c/C++"と入力して間違ったスペルをしたいだけです – zjsworm

+0

Sinan:確かに、もちろん、しかし、私は誤植についての少しのコメントは必要ではないと思う:) –

答えて

6

まず、マイナーポイント:決して使用されない変数を宣言することはメモリの浪費であり、したがってそれ自体バグです。

第2に、さらに重要なことは、あなたは決して使用しなかった変数の宣言を書き留めることに苦労したことです。あなたはそれを使用する計画がない場合、あなたは変数を宣言するのに気にしなかったので、これはを忘れてを使用することを示唆している!その場所に間違った変数名をタイプした可能性はありますか?その変数に格納する結果を持つ重要な計算を実行するのを忘れた可能性はありますか?もちろん

、あなたはそれが警告ないエラーだが、その警告が重要な部分にあなたを指すことができる場所、それが状況を確認するのは簡単です理由である、あなたが必要としないことになった何かを宣言している場合があります実際にはバグとなるでしょう。

+2

ほとんどのコンパイラは最適化できないctorとdctorを持つオブジェクトでない限り、最初の点はおそらく問題ではないでしょう。 – strager

+0

コンストラクタとデストラクタが最適化されていない場合、オブジェクトが使用されていないと言っても間違いです(コンパイラが警告を出した場合、コンパイラのバグです)。 –

+0

@ケネディ、私は同意しない。変数はプログラマによって使用されていませんが、オブジェクトはまだインスタンス化されています。この警告は、オブジェクトが使用されていない状態でインスタンス化されているオブジェクトに関するものであり、何もしない変数に関するものではありません。 – strager

1

これはバグの存在を示している可能性がありますが、宣言されているが未使用の変数は明らかにプログラミングエラーです。

2

おそらくあなたが変数を使うことを意図していたからです。変数を宣言してから使用しないでください:)

これは役に立つ警告であり、ほとんどの言語で存在します。

それはあなたが誤って代わりにあなたが意図1の別の変数を使用し、タイプミスを検出するのを助けることができる、この警告は、あなたが使用していない1を思い出させます:)

+2

私はあなたが "一般的に変数を宣言しておかない*使用しない"という意味だと思う; –

+0

ああ、ありがとう、固定:) –

2

それは発生しませんエラー。変数は何もしていないので、あなたがそれを使用しようとしたが、そうではないことを示す可能性があるため、警告が表示されます(通常、ほとんどのコンパイラで上位レベルのみにあります)。場合によっては、コードが正しく動作していない可能性があります。

コンパイラがあなたに少し奇妙なことをしたことを警告しようとしているだけで、コードが失敗することはありません。

+0

これはコンパイルエラーを引き起こさない。すべての警告をエラーと見なしています)。しかし、私はOPがプログラミングエラー*とみなすことができると思っていたと思うので、コンパイラはそのような変数について警告を出します。 –

+0

はい、私もそれを説明しようとしていましたが、元の質問は特に明確ではありませんでした。だから私は両方を目指していると思った。 – Peter

+0

はい、私はすべての警告がいくつかのケースでエラーに終わると思っていたが、これにはどういうことができるのか分からなかった。今私はそれについてはっきりしている、皆さんありがとう! – zjsworm

0

このようなことについてお尋ねしますか?

int function() { 
    double x; 

    return 42; 
} 

だけでなく、それは未使用です、ので、変数xが未使用であると言って警告があります。変数が未使用の場合は何もしないので、警告です。

変数を間違って入力したり誤ってシャドウしたりすると、この警告が表示されることがあります。例えば:

void printArgument10Times(int i) { 
    for(int i = 0; i < 10; ++i) { 
     std::cout << i << std::endl; 
    } 
} 

// ... 

printArgument10Times(42); 

の代わりに42 10回を印刷する、それが0 i〜9は、シャドウとも未使用だった印刷します。コンパイラはこれらのことをあなたに伝えます。

*もちろん、C++ではコンストラクタとデコンストラクタが呼び出されています。

関連する問題