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

why i cannot use the auto keyword in the last version of gcc

本文关键字:auto 关键字 GCC 不能 最新版 新版本 为什么      更新时间:2023-10-16

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

auto x = 1;

下面列出的报告错误:

D:DEVCBCppTestmain.cpp||In function 'int main()':|
D:DEVCBCppTestmain.cpp|22|warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]|
D:DEVCBCppTestmain.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 支持

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


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

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

这是由于 GCC 编译器默认未启用该功能。如果您使用的是代码块,请转到"设置"--"编译器">并启用该功能,如下所示 - https://i.stack.imgur.com/e4Wq6.jpg

对我来说,

将"-std=c++0x"添加到g ++命令行解决了这个问题。