c++:如何确保所有变量都被初始化
C++ : how to make sure all variables are initialized?
最近我在一个未初始化的变量上遇到了很多麻烦。
在Java中,变量的默认值为null,因此当使用未初始化的变量时可能会抛出异常。如果我没理解错的话,在c++中,变量是用内存中的任何数据初始化的。这意味着程序很可能会运行,甚至很难知道它有什么问题。
处理这个问题的干净方法是什么?是否有一些好的编程习惯可以降低风险?在我的例子中,变量是在头文件中声明的,应该在cpp文件中初始化,这是一个更容易出错的例子。
thx
收到几个答案后的版本:
对不起,我的问题不够具体。
我得到的答案是使用flag来通知编译器未初始化的变量将是有用的。
但是有一些罕见的变量不能在开始时初始化,因为这取决于你的系统的行为。
头文件
double learnedValue;
/* 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++中,你显然可以很高兴,根本不知道有问题。div或?
请确保在编译程序时设置了适当的警告级别。当使用未初始化的变量时,编译器会发出适当的警告。
在g++中,-Wall编译器选项会显示所有警告。
在Visual studio中,您可能必须使用警告级别4。
另外,市场上也有一些静态代码分析工具。
你不应该在头文件中定义变量(只能声明)。否则,当你在几个。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
...
*/
你可以在声明变量的地方定义它们
c++11允许在类内部初始化变量。如果编译器还没有实现,那么构造函数初始化列表就是要检查的区域。
c#可以初始化这个变量。但是c++不是,所以当使用指针时没有初始化,它总是抛出异常。您应该养成在类构造函数中初始化所有变量的好习惯。
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持