g++和g++14的未初始化值的差异

Difference of uninitialized values for g++ and g++14

本文关键字:初始化 g++14 g++      更新时间:2023-10-16

如果我用c++编译并运行一个简单的程序,如下所示:

int main(){
int x;
cout << x << endl;
}

我在Linux中编译,说g++myProgram.cc(或g++-std=c++14(,我显然得到了/a.out可执行文件,运行良好,并打印自动初始化的值0。

但是,如果我用g++14myProgram.cc编译代码,我会收到一个错误,说x未初始化。

g++14是某种不同的版本吗?我很困惑为什么会发生这种事,谢谢!

打印自动初始化的值0。

否, 一千次,否:-(

自动变量是而不是隐式初始化的(a(。特定的实现可以将它们初始化为特定的值,但这不是标准强制要求或保证的。

问题的解决方案显式初始化它(或在尝试使用它之前分配给它(。

换句话说,使用:

int x = 0;

(a(带有构造函数的类或结构显然是初始化的,但这里的情况并非如此,因为您使用的是简单的int类型。

来自C++引用的初始化部分(对所有版本有效(。您可以推断,本地非静态基元类型变量在声明时不会自动初始化为已知的值/状态,您必须显式执行。请注意,尽管没有初始化,但它们确实包含一个值,但它不是确定性的,它可以是任何东西,因此您对显式初始化(至关重要(。因此,确保变量处于已知和定义的状态。您的代码实际上显示了所谓的未定义行为,因为它使用了一个具有未知和未定义值/状态的变量。

这对所有版本的C++都有效。因此:

  • 您的编译器可能有一个错误,不太可能是因为初始化规则这样简单的事情。

  • 它可能是编译器的特定于实现的详细信息。

  • 该命令可能正在调用其他东西

作为一种很好的做法,这将使您在未来避免许多错误,在使用变量之前始终尽快初始化它们

g++-std=c++14<>g++14

gcc有些地方不稳定:

来自另一篇关于GCC 的帖子

没有"GCC官方定义",只有英文官方定义。

这篇文章的意思是,GCC在C++14发布之前已经实现了即将推出的C++14功能的实验原型,未来的版本将不会试图与这些实验保持向后兼容性。

两个版本之间的向后兼容性仅针对国际标准中包含的功能保持。

这是因为,在标准发布之前,新C++功能的规范可能会发生相当大的变化。如果保证支持它们的早期实验与最终在标准中发布的最终真实功能向前兼容,那将是疯狂的。

简而言之:使用实验特性的风险自负,不要期望它们在下一版本的GCC中以同样的方式工作。