g++和g++14的未初始化值的差异
Difference of uninitialized values for g++ and g++14
如果我用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中以同样的方式工作。
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 关于 C++14 lambda 的初始化捕获
- g++和g++14的未初始化值的差异
- 初始化 C++14 中唯一指针向量的正确方法
- C++14 结构体上的统一初始化
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 使用 k 个键值对为零的存储桶初始化 c++14 unordered_map
- C++14 元编程:在编译/初始化时自动构建类型列表
- C++14 值初始化问题
- C++14在非聚合上的统一初始化
- 在C++14中,对浮点变量进行双重赋值的统一初始化不会产生缩小错误
- 在C++(98、11和14)中初始化静态数据成员的正确方法是什么
- C++14正在初始化类构造函数初始化列表中的继承成员
- 使用c++14初始化程序
- C++14 constexpr静态const std::数组初始化
- c++ 11/ c++ 14中的auto和大括号初始化
- vc++ 14 (VS2015)中数组值初始化的内部编译器错误