为什么我不能在最新版本的gcc中使用auto关键字

问题描述:

最近,我尝试使用C++ 11支持的新功能,但是我编写了这样的语句,但编译器运行失败。为什么我不能在最新版本的gcc中使用auto关键字

auto x = 1; 

下列报错:

D:\DEV\CBCppTest\main.cpp||In function 'int main()':| 
D:\DEV\CBCppTest\main.cpp|22|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]| 
D:\DEV\CBCppTest\main.cpp|22|error: 'x' does not name a type| 
||=== Build finished: 1 errors, 1 warnings ===| 

为什么MinGW的最后一个版本的GCC 4.7.0不能支持这种说法。但是vs10的编译器通过了。任何人都可以知道这个问题的原因吗?

“GCC为2011 ISO C++标准提供了实验支持,可以使用-std = C++ 11或-std = gnu ++ 11编译器选项启用此支持;前者禁用GNU扩展。

它来自这里:c+11 support

+0

谢谢,很困惑我很久。 – 2012-04-08 15:20:25

编译时,你需要添加-std=c++11到g ++命令行。

这是由于GCC编译器默认不启用该功能。如果你在Codeblocks上,去设置 - >编译器,并启用功能,如图所示 - http://imgur.com/KrHx8nh

解释什么是编译器实际上抱怨:auto曾经是一个旧的C关键字,声明这个变量有自动仓储。这些关键字与类型系统无关,它们指定变量在内存中的表示方式:它们存储在何处(处理器寄存器与主内存/堆栈)以及内存如何回收。 auto表示变量存储在堆栈中(尽管处理器可能将其优化为处理器寄存器),并且当变量超出范围时,内存为 - 这是几乎任何情况下的正确选择和因此是默认的,所以几乎没有人使用这个旧的auto关键字。然而,C++03仍然为代码提供了向后兼容性;今天的编译器仍然想要支持遗留代码。


虽然经常想要对象驻留在堆上,你仍然可以访问那些通过堆栈变量; C++有自己的方法使用堆分配内存(new,std::vector等),你不需要不安全的C型malloc的东西。

对于我添加“-std = C++ 0x”“到g ++命令行修复了这个问题