1

最近我在使用非初始化变量时遇到了很多麻烦。

在Java中,变量的默认值为null,因此如果使用未初始化的变量,很可能会抛出异常。如果我理解的话,在 C++ 中,变量会使用内存中的任何数据进行初始化。这意味着程序很可能会运行,甚至可能很难知道它有什么问题。

处理这个问题的干净方法是什么?是否有一些好的编程习惯可以降低风险?在我的例子中,变量是在头文件中声明的,并且应该在 cpp 文件中初始化,这是一个更容易出错的例子。

谢谢


收到几个答案后的版本:

抱歉,我的问题不够具体。

我得到的使用 flag 让编译器了解未初始化变量的答案将很有用。

但是很少有大小写变量不能在一开始就被初始化,因为这取决于你系统的行为。

在头文件中

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”这一行。

但是该程序运行良好,只是将 learnValue 的值初始化为声明时内存中的任何内容。

在 Java 中,这样的错误不是问题,因为使用学习值的代码很可能会崩溃或抛出异常(至少你知道出了什么问题)。

在 C++ 中,您显然可以很高兴,但根本不知道有问题。或者 ?

4

5 回答 5

4

请确保在编译程序时设置了适当的警告级别。每当使用未初始化的变量时,编译器都会发出适当的警告。

在 g++ 上,-Wall 编译器选项将显示所有警告。

在 Visual Studio 上,您可能必须使用警告级别 4。

此外,市场上有一些静态代码分析工具。 cppCheck就是这样一款免费提供的工具。

于 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

您可以在声明它们的地方定义变量

于 2013-04-09T06:20:59.037 回答
0

c++11 允许你在类中初始化变量。如果编译器尚未实现,那么构造函数初始化列表就是要检查的区域。

于 2013-04-09T06:27:02.983 回答
-1

C# 可以初始化变量。但是 C++ 没有,所以当使用没有初始化的指针时,它总是抛出异常。你应该养成在类构造函数中初始化所有变量的好习惯。

于 2013-04-09T07:19:57.133 回答