为什么我不能在最新版本的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
答
编译时,你需要添加-std=c++11
到g ++命令行。
答
解释什么是编译器实际上抱怨:auto
曾经是一个旧的C关键字,声明这个变量有自动仓储。这些关键字与类型系统无关,它们指定变量在内存中的表示方式:它们存储在何处(处理器寄存器与主内存/堆栈)以及内存如何回收。 auto
表示变量存储在堆栈中(尽管处理器可能将其优化为处理器寄存器),并且当变量超出范围时,内存为 - 这是几乎任何情况下的正确选择和因此是默认的,所以几乎没有人使用这个旧的auto
关键字。然而,C++03
仍然为代码提供了向后兼容性;今天的编译器仍然想要支持遗留代码。
虽然经常想要对象驻留在堆上,你仍然可以访问那些通过堆栈变量; C++有自己的方法使用堆分配内存(new
,std::vector
等),你不需要不安全的C型malloc
的东西。
答
对于我添加“-std = C++ 0x”“到g ++命令行修复了这个问题
谢谢,很困惑我很久。 – 2012-04-08 15:20:25