23

所有,最近我尝试使用 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的编译通过了。谁能知道这个问题的原因?

4

5 回答 5

33

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

它来自这里:c+11 支持

于 2012-04-08T15:19:10.513 回答
9

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


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

于 2013-07-23T12:31:08.083 回答
8

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

于 2012-04-08T15:19:23.730 回答
2

这是由于 GCC 编译器默认未启用该功能。如果您使用的是 Codeblocks,请转到 Settings --> Compiler 并启用该功能,如图所示 - http://imgur.com/KrHx8nh

于 2013-07-23T12:19:08.697 回答
1

对我来说,在 g++ 命令行中添加“-std=c++0x””解决了这个问题。

于 2014-06-10T22:08:00.637 回答