1

最近、初期化されていない変数で多くの問題が発生しました。

Java では、変数のデフォルト値は null であるため、初期化されていない変数を使用すると例外がスローされる可能性があります。私が理解していれば、C++ では、メモリ内にあることが判明したデータで変数が初期化されます。これは、プログラムが実行される可能性が高く、何か問題があることを知ることさえ難しいことを意味します.

これに対処するためのクリーンな方法は何でしょうか? リスクを軽減する良いプログラミング習慣はありますか? 私の場合、変数はヘッダー ファイルで宣言されており、cpp ファイルで初期化する必要がありました。これは、エラーが発生しやすくなる例です。

どうも


いくつかの回答を受け取った後の版:

申し訳ありませんが、私の質問は十分に具体的ではありませんでした。

コンパイラが初期化されていない変数について通知を受けるためにフラグを使用するという答えは役に立ちます。

ただし、システムの動作によっては、最初に変数を初期化できない場合がまれにあります。

ヘッダーファイルで

double learnedValue;

cppファイルで

/* code that has nothing to do with learnedValue
...
*/

learnedValue = a*b*c; // values of a, b and c computed in the code above

/*code making use of learned value
...
*/

何が起こったのかというと、「learnedValue=a*b*c」という行を忘れていました。

しかし、宣言されたときにメモリにあったもので初期化されたlearnedValueの値だけで、プログラムはうまく機能していました。

Java では、学習した値を使用するコードがクラッシュしたり、例外をスローしたりする可能性が高いため、このようなエラーは問題になりません (少なくとも、何が間違っていたかがわかります)。

C++ では、明らかに幸せで、問題があることにまったく気付かないことがあります。または ?

4

5 に答える 5

4

プログラムのコンパイル中に適切な警告レベルが設定されていることを確認してください。コンパイラは、初期化されていない変数が使用されるたびに、適切な警告を発行します。

g++ では、-Wall コンパイラ オプションはすべての警告を表示します。

Visual Studio では、警告レベル 4 を使用する必要がある場合があります。

また、市場で入手可能な静的コード分析ツールがいくつかあります。 cppCheckは、無料で利用できるツールの 1 つです。

于 2013-04-09T06:24:25.510 に答える
3

ヘッダーで変数を定義しないでください (宣言するだけです)。そうしないと、いくつかの .cpp ファイルにヘッダーを含めるときに、他のエラーが発生します。

実際に変数を定義するときに、初期値 (0 など) を与えることもできます。C++ では、(ローカル) 変数に割り当てる値が得られるまで、変数の定義を延期することも一般的です。

ヘッダファイル内

extern double learnedValue;
^^^^^^

cpp ファイル内

double learnedValue = 0;

/* code that has nothing to do with learnedValue
...
*/

learnedValue = a*b*c; // values of a, b and c computed in the code above

/*code making use of learned value
...
*/
于 2013-04-09T07:14:18.253 に答える
0

c++11 では、クラス内の変数を初期化できます。それがコンパイラーによってまだ実装されていない場合は、コンストラクターの初期化リストがチェック対象の領域です。

于 2013-04-09T06:27:02.983 に答える
-1

C# は変数を初期化できます。ただし、C++ はそうではないため、初期化せずにポインターを使用すると、常に例外がスローされます。クラス コンストラクターですべての変数を初期化することを習慣にする必要があります。

于 2013-04-09T07:19:57.133 に答える