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

时间:2012-04-08 15:16:39

标签: c++

所有,最近我尝试使用c ++ 11支持的新功能,但我编写了这样的语句,但编译器运行失败。

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的编译器通过了。有谁知道这个问题的原因?

5 个答案:

答案 0 :(得分:31)

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

它来自:c+11 support

答案 1 :(得分:8)

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


1 虽然通常希望对象驻留在堆上,但您仍然可以通过堆栈上的变量访问它们; C ++有自己的使用堆分配内存的方法(newstd::vector等),你不需要不安全的C风格的malloc东西。

答案 2 :(得分:7)

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

答案 3 :(得分:2)

这是由于GCC编译器默认不启用此功能。如果您使用的是Codeblocks,请转到设置 - >编译并启用如下所示的功能 - http://imgur.com/KrHx8nh

答案 4 :(得分:1)

我向g ++命令行添加“-std = c ++ 0x”“修复了问题。