【发布时间】:2013-04-09 06:16:16
【问题描述】:
最近我在使用非初始化变量时遇到了很多麻烦。
在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”这一行。
但是程序运行良好,只是用声明时内存中的任何内容初始化了learnedValue的值。
在 Java 中,这样的错误不是问题,因为使用学习值的代码很可能会崩溃或抛出异常(至少您知道出了什么问题)。
在 C++ 中,您显然可以很高兴,但根本不知道有问题。还是?
【问题讨论】:
-
养成在定义时初始化变量的习惯。
-
在 C++ 中,变量被初始化为你决定用什么来初始化它。如果您让它们不确定,您将掷骰子并抓住机会(即不确定 = 用作评估时未定义的行为)。
-
只需将变量定义为您想要的任何值。例如,如果您声明
int,请将其设置为等于0。 -
您可以使用编译器警告标志。例如,如果您使用 gcc。
-Wuninitialized会警告你所有未初始化的变量。 -
始终使用
-Wall和-Wextra构建,始终在声明时进行初始化,并在链接有错误的代码时处理痛苦:)
标签: c++ initialization declaration