虽然 C++ 是一种非凡的语言,但它也是一种存在许多陷阱的语言,尤其是对于没有经验的程序员而言。我说的是类中原始类型的未初始化变量之类的事情,例如
class Data {
std::string name;
unsigned int version;
};
// ...
Data data;
if (data.version) { ... } // use of uninitialized member
我知道这个例子过于简单了,但在实践中,即使是有经验的开发人员有时也会忘记在构造函数中初始化他们的成员变量。虽然默认情况下保持原语未初始化可能是 C 的遗留问题,但它为我们提供了性能(保持一些数据未初始化)和正确性(初始化所有数据)之间的选择。
好的,但是如果逻辑颠倒了呢?我的意思是如果所有原语都用零初始化怎么办?或者需要显式初始化,缺少初始化会产生编译错误。当然,为了充分的灵 active ,人们会使用一种特殊的语法/类型来保留未初始化的变量/成员,例如
unsigned int x = std::uninitialized_value;
或
Data::Data() : name(), version(std::uninitialized_value) {}
我知道这可能会导致现有的 C++ 代码出现问题,该代码允许未初始化的数据,但新代码可以包装在一个特殊的 block 中(extern "C"
在我看来是一个例子)让编译器知道应严格检查一段特定的代码是否有未初始化的数据。
抛开兼容性问题不谈,这种方法会减少我们代码中的错误,这是我们都感兴趣的。
- 你听说过这样的提议吗?
- 这样的提议是否有意义?
- 您认为这种方法有什么缺点吗?
注意 1:我使用了术语“严格”,因为这个想法与 JavaScript 语言的“严格模式”相关,如 Mozilla Developer Network site 中所述
eliminates some JavaScript silent errors by changing them to throw errors
注意2:请不要关注提议中使用的提议语法,它只是为了说明一个观点。
注意 3:我知道像 cppcheck 这样的工具可以很容易地找到未初始化的成员变量,但我的想法是为这种检查提供编译时支持。
最佳答案
使用 -Werror=uninitialized
,它完全符合您的要求。
然后您可以使用 unsigned int x = x;
关于c++ - 有没有人考虑过更多 "strict"风格的 C++,其中默认/需要初始化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28572642/