作者:手机用户2502939987 | 来源:互联网 | 2023-10-10 15:52
如果我使用c ++编译并运行一个简单程序,如下所示:
int main(){
int x;
cout <}
然后我在Linux上编译说g ++ myProgram.cc(或g ++ -std = c ++ 14),显然得到了./a.out可执行文件,该可执行文件运行良好,并且自动初始化的值为0。
但是,如果我使用g ++ 14 myProgram.cc编译代码,则会收到一条错误消息,提示x未初始化。
g ++ 14是某种不同的版本吗?我很困惑为什么会这样,谢谢!
来自C ++参考的initialization部分(对所有版本均有效)。您可以推断,声明时局部非静态原始类型变量不会自动初始化为众所周知的值/状态,您必须显式地进行操作。请注意,尽管未初始化,但它们确实包含一个值,但它不是确定性的,可以是任何值,因此,显式初始化的(至为重要)重要性。因此,确保变量的已知状态和定义状态。您的代码实际上表现出所谓的未定义行为,因为它使用具有未知值和未定义值/状态的变量。
这对所有版本的C ++有效。因此:
作为一种好的做法,这将使您免于将来遇到许多错误,在使用变量之前,请务必尽早初始化变量。
,
打印出自动初始化的值0。
不, 一千次,不:-)
自动变量不是 隐式初始化的(a)。特定的实现可以将它们初始化为特定的值,但这不是标准要求或保证的。
针对您问题的解决方案是明确对其进行初始化(或在尝试使用它之前分配给它)。
换句话说,使用:
int x = 0;
(a)带有构造函数的类或结构显然已初始化,但是这里不是这种情况,因为您使用的是简单的int
类型。
,
g ++ -std = c ++ 14 g ++ 14
gcc在某些地方很奇怪:
From another post about GCC
没有“正式的GCC定义”,只有官方的英语定义。
这段文字意味着,在GCC之前在发布C ++ 14之前就实施了即将发布的C ++ 14功能的实验原型的地方,将来的版本将不会费心尝试保持与这些实验的向后兼容性。
两个版本之间的向后兼容性仅针对国际标准中包含的功能进行维护。
这是因为在标准发布之前,新C ++功能的规范可能会发生巨大变化。保证早期支持它们的实验将与最终发布在标准中的最终真实功能向前兼容是很疯狂的。
简而言之:使用实验性功能需要您自担风险,并且不要期望它们在下一版GCC中的工作方式相同。