【发布时间】:2019-11-17 11:37:41
【问题描述】:
如果我像这样在 c++ 中编译并运行一个简单的程序:
int main(){
int x;
cout << x << endl;
}
我在 Linux 中编译时说 g++ myProgram.cc(或 g++ -std=c++14),显然我得到了运行良好的 ./a.out 可执行文件,并打印了自动初始化的值 0。
但是如果我使用 g++14 myProgram.cc 编译我的代码,我会收到一条错误消息,指出 x 未初始化。
g++14 是某种不同的版本吗?我很困惑为什么会这样,谢谢!
【问题讨论】:
-
两者都不是。出于某种原因,只是一个编译器仅在 C++14 中发出诊断。无论是C++11,还是C++14,或者任何C++版本,上面的程序都是未定义的行为,并且被破坏了。
-
哦,它坏了?我认为未初始化值的 C++ 标准对于数字是 0,对于字符和字符串是空的。以及结构和类的默认构造函数,这不是真的吗?无论如何我都应该避免这样做吗? @SamVarshavchik
-
我们无法知道
g++14是什么。这取决于您的系统是如何设置的,它与 C++ 无关。您可以尝试运行which g++14来确定使用该文件时执行的文件并查看它。我怀疑它只是简单地调用g++ -std=c++14,这意味着它默认编译为 C++ 14 版本的 C++。 -
这仅适用于静态范围的值。不是自动存储。
-
@ming 这是错误的。本地自动变量在默认初始化后具有不确定的值(这是您在此处使用的)。您总是需要显式地使用一个值进行初始化。但是,这不适用于具有静态存储持续时间的变量(例如全局变量)。无论是否有警告/错误消息,您的程序都有未定义的行为。是的,您应该始终初始化变量,无论它们的范围如何。
标签: c++