所有,最近我尝试使用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的编译器通过了。有谁知道这个问题的原因?
答案 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 ++有自己的使用堆分配内存的方法(new
,std::vector
等),你不需要不安全的C风格的malloc
东西。
答案 2 :(得分:7)
编译时,需要将-std=c++11
添加到g ++命令行。
答案 3 :(得分:2)
这是由于GCC编译器默认不启用此功能。如果您使用的是Codeblocks,请转到设置 - >编译并启用如下所示的功能 - http://imgur.com/KrHx8nh
答案 4 :(得分:1)
我向g ++命令行添加“-std = c ++ 0x”“修复了问题。